LLVM 23.0.0git
ARMTargetMachine.h
Go to the documentation of this file.
1//===-- ARMTargetMachine.h - Define TargetMachine for ARM -------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares the ARM specific subclass of TargetMachine.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_ARM_ARMTARGETMACHINE_H
14#define LLVM_LIB_TARGET_ARM_ARMTARGETMACHINE_H
15
16#include "ARMSubtarget.h"
17#include "llvm/ADT/StringMap.h"
18#include "llvm/ADT/StringRef.h"
24#include <memory>
25#include <optional>
26
27namespace llvm {
28
30public:
32
33protected:
34 std::unique_ptr<TargetLoweringObjectFile> TLOF;
37
38 /// Reset internal state.
39 void reset() override;
40
41public:
42 ARMBaseTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
44 std::optional<Reloc::Model> RM,
45 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL);
47
48 const ARMSubtarget *getSubtargetImpl(const Function &F) const override;
49 // DO NOT IMPLEMENT: There is no such thing as a valid default subtarget,
50 // subtargets are per-function entities based on the target-specific
51 // attributes of each function.
52 const ARMSubtarget *getSubtargetImpl() const = delete;
53 bool isLittleEndian() const { return isLittle; }
54
56
57 // Pass Pipeline Configuration
59
61
63 return TLOF.get();
64 }
65
70
75
80
81 bool isTargetHardFloat() const {
82 return TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
83 TargetTriple.getEnvironment() == Triple::GNUEABIHFT64 ||
84 TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
85 TargetTriple.getEnvironment() == Triple::EABIHF ||
86 (TargetTriple.isOSBinFormatMachO() &&
87 TargetTriple.getSubArch() == Triple::ARMSubArch_v7em) ||
89 }
90
91 bool targetSchedulesPostRAScheduling() const override { return true; };
92
95 const TargetSubtargetInfo *STI) const override;
96
97 /// Returns true if a cast between SrcAS and DestAS is a noop.
98 bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override {
99 // Addrspacecasts are always noops.
100 return true;
101 }
102
103 bool isGVIndirectSymbol(const GlobalValue *GV) const {
104 if (!shouldAssumeDSOLocal(GV))
105 return true;
106
107 // 32 bit macho has no relocation for a-b if a is undefined, even if b is in
108 // the section that is being relocated. This means we have to use o load
109 // even for GVs that are known to be local to the dso.
110 if (getTargetTriple().isOSBinFormatMachO() && isPositionIndependent() &&
112 return true;
113
114 // In ELF PIC mode, weak symbols referenced via the constant pool use a
115 // PC-relative expression (e.g. .long xxx-(.LPC+8)) that the assembler
116 // eagerly resolves when both the symbol and label are in the same section.
117 // This prevents the linker from overriding a weak definition with a
118 // non-weak one. Use GOT indirection for weak symbols to avoid this.
119 if (getTargetTriple().isOSBinFormatELF() && isPositionIndependent() &&
120 GV->isWeakForLinker())
121 return true;
122
123 return false;
124 }
125
128 convertFuncInfoToYAML(const MachineFunction &MF) const override;
132 SMRange &SourceRange) const override;
137};
138
139/// ARM/Thumb little endian target machine.
140///
142public:
143 ARMLETargetMachine(const Target &T, const Triple &TT, StringRef CPU,
145 std::optional<Reloc::Model> RM,
146 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,
147 bool JIT);
148};
149
150/// ARM/Thumb big endian target machine.
151///
153public:
154 ARMBETargetMachine(const Target &T, const Triple &TT, StringRef CPU,
156 std::optional<Reloc::Model> RM,
157 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,
158 bool JIT);
159};
160
161} // end namespace llvm
162
163#endif // LLVM_LIB_TARGET_ARM_ARMTARGETMACHINE_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
#define F(x, y, z)
Definition MD5.cpp:54
#define T
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
Basic Register Allocator
This pass exposes codegen information to IR-level passes.
ARMBETargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
TargetLoweringObjectFile * getObjFileLowering() const override
bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange) const override
Parse out the target's MachineFunctionInfo from the YAML reprsentation.
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
std::unique_ptr< TargetLoweringObjectFile > TLOF
void reset() override
Reset internal state.
ARMBaseTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL)
Create an ARM architecture model.
MachineFunctionInfo * createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, const TargetSubtargetInfo *STI) const override
Create the target's instance of MachineFunctionInfo.
bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override
Returns true if a cast between SrcAS and DestAS is a noop.
yaml::MachineFunctionInfo * createDefaultFuncInfoYAML() const override
Allocate and return a default initialized instance of the YAML representation for the MachineFunction...
bool targetSchedulesPostRAScheduling() const override
True if subtarget inserts the final scheduling pass on its own.
bool isGVIndirectSymbol(const GlobalValue *GV) const
const ARMSubtarget * getSubtargetImpl() const =delete
ScheduleDAGInstrs * createMachineScheduler(MachineSchedContext *C) const override
Create an instance of ScheduleDAGInstrs to be run within the standard MachineScheduler pass for this ...
StringMap< std::unique_ptr< ARMSubtarget > > SubtargetMap
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Return a TargetTransformInfo for a given function.
ScheduleDAGInstrs * createPostMachineScheduler(MachineSchedContext *C) const override
Similar to createMachineScheduler but used when postRA machine scheduling is enabled.
yaml::MachineFunctionInfo * convertFuncInfoToYAML(const MachineFunction &MF) const override
Allocate and initialize an instance of the YAML representation of the MachineFunctionInfo.
ARMLETargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
CodeGenTargetMachineImpl(const Target &T, StringRef DataLayoutString, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
bool isDeclarationForLinker() const
bool hasCommonLinkage() const
static bool isWeakForLinker(LinkageTypes Linkage)
Whether the definition of this global may be replaced at link time.
This class provides access to building LLVM's passes.
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:303
Represents a range in source code.
Definition SMLoc.h:47
A ScheduleDAG for scheduling lists of MachineInstr.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:133
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
bool isPositionIndependent() const
const Triple & getTargetTriple() const
bool shouldAssumeDSOLocal(const GlobalValue *GV) const
std::unique_ptr< const MCSubtargetInfo > STI
TargetOptions Options
Target-Independent Code Generator Pass Configuration Options.
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
@ ARMSubArch_v7em
Definition Triple.h:145
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.