1 //===-- llvm/Target/TargetLoweringObjectFile.h - Object Info ----*- 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 implements classes used to handle lowerings specific to common 10 // object file formats. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H 15 #define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H 16 17 #include "llvm/MC/MCObjectFileInfo.h" 18 #include "llvm/MC/MCRegister.h" 19 #include <cstdint> 20 21 namespace llvm { 22 23 struct Align; 24 class Constant; 25 class DataLayout; 26 class Function; 27 class GlobalObject; 28 class GlobalValue; 29 class MachineBasicBlock; 30 class MachineModuleInfo; 31 class Mangler; 32 class MCContext; 33 class MCExpr; 34 class MCSection; 35 class MCSymbol; 36 class MCSymbolRefExpr; 37 class MCStreamer; 38 class MCValue; 39 class Module; 40 class SectionKind; 41 class StringRef; 42 class TargetMachine; 43 class DSOLocalEquivalent; 44 45 class TargetLoweringObjectFile : public MCObjectFileInfo { 46 /// Name-mangler for global names. 47 Mangler *Mang = nullptr; 48 49 protected: 50 bool SupportIndirectSymViaGOTPCRel = false; 51 bool SupportGOTPCRelWithOffset = true; 52 bool SupportDebugThreadLocalLocation = true; 53 bool SupportDSOLocalEquivalentLowering = false; 54 55 /// PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values 56 /// for EH. 57 unsigned PersonalityEncoding = 0; 58 unsigned LSDAEncoding = 0; 59 unsigned TTypeEncoding = 0; 60 unsigned CallSiteEncoding = 0; 61 62 /// This section contains the static constructor pointer list. 63 MCSection *StaticCtorSection = nullptr; 64 65 /// This section contains the static destructor pointer list. 66 MCSection *StaticDtorSection = nullptr; 67 68 const TargetMachine *TM = nullptr; 69 70 public: 71 TargetLoweringObjectFile() = default; 72 TargetLoweringObjectFile(const TargetLoweringObjectFile &) = delete; 73 TargetLoweringObjectFile & 74 operator=(const TargetLoweringObjectFile &) = delete; 75 virtual ~TargetLoweringObjectFile(); 76 getMangler()77 Mangler &getMangler() const { return *Mang; } 78 79 /// This method must be called before any actual lowering is done. This 80 /// specifies the current context for codegen, and gives the lowering 81 /// implementations a chance to set up their default sections. 82 virtual void Initialize(MCContext &ctx, const TargetMachine &TM); 83 84 virtual void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &TM, 85 const MCSymbol *Sym) const; 86 87 /// Emit the module-level metadata that the platform cares about. emitModuleMetadata(MCStreamer & Streamer,Module & M)88 virtual void emitModuleMetadata(MCStreamer &Streamer, Module &M) const {} 89 90 /// Emit Call Graph Profile metadata. 91 void emitCGProfileMetadata(MCStreamer &Streamer, Module &M) const; 92 93 /// Get the module-level metadata that the platform cares about. getModuleMetadata(Module & M)94 virtual void getModuleMetadata(Module &M) {} 95 96 /// Given a constant with the SectionKind, return a section that it should be 97 /// placed in. 98 virtual MCSection *getSectionForConstant(const DataLayout &DL, 99 SectionKind Kind, const Constant *C, 100 Align &Alignment) const; 101 102 virtual MCSection * 103 getSectionForMachineBasicBlock(const Function &F, 104 const MachineBasicBlock &MBB, 105 const TargetMachine &TM) const; 106 107 virtual MCSection * 108 getUniqueSectionForFunction(const Function &F, 109 const TargetMachine &TM) const; 110 111 /// Classify the specified global variable into a set of target independent 112 /// categories embodied in SectionKind. 113 static SectionKind getKindForGlobal(const GlobalObject *GO, 114 const TargetMachine &TM); 115 116 /// This method computes the appropriate section to emit the specified global 117 /// variable or function definition. This should not be passed external (or 118 /// available externally) globals. 119 MCSection *SectionForGlobal(const GlobalObject *GO, SectionKind Kind, 120 const TargetMachine &TM) const; 121 122 /// This method computes the appropriate section to emit the specified global 123 /// variable or function definition. This should not be passed external (or 124 /// available externally) globals. 125 MCSection *SectionForGlobal(const GlobalObject *GO, 126 const TargetMachine &TM) const; 127 128 virtual void getNameWithPrefix(SmallVectorImpl<char> &OutName, 129 const GlobalValue *GV, 130 const TargetMachine &TM) const; 131 132 virtual MCSection *getSectionForJumpTable(const Function &F, 133 const TargetMachine &TM) const; getSectionForLSDA(const Function &,const MCSymbol &,const TargetMachine &)134 virtual MCSection *getSectionForLSDA(const Function &, const MCSymbol &, 135 const TargetMachine &) const { 136 return LSDASection; 137 } 138 139 virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, 140 const Function &F) const; 141 142 /// Targets should implement this method to assign a section to globals with 143 /// an explicit section specfied. The implementation of this method can 144 /// assume that GO->hasSection() is true. 145 virtual MCSection * 146 getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, 147 const TargetMachine &TM) const = 0; 148 149 /// Return an MCExpr to use for a reference to the specified global variable 150 /// from exception handling information. 151 virtual const MCExpr *getTTypeGlobalReference(const GlobalValue *GV, 152 unsigned Encoding, 153 const TargetMachine &TM, 154 MachineModuleInfo *MMI, 155 MCStreamer &Streamer) const; 156 157 /// Return the MCSymbol for a private symbol with global value name as its 158 /// base, with the specified suffix. 159 MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV, 160 StringRef Suffix, 161 const TargetMachine &TM) const; 162 163 // The symbol that gets passed to .cfi_personality. 164 virtual MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, 165 const TargetMachine &TM, 166 MachineModuleInfo *MMI) const; 167 getPersonalityEncoding()168 unsigned getPersonalityEncoding() const { return PersonalityEncoding; } getLSDAEncoding()169 unsigned getLSDAEncoding() const { return LSDAEncoding; } getTTypeEncoding()170 unsigned getTTypeEncoding() const { return TTypeEncoding; } 171 unsigned getCallSiteEncoding() const; 172 173 const MCExpr *getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding, 174 MCStreamer &Streamer) const; 175 getStaticCtorSection(unsigned Priority,const MCSymbol * KeySym)176 virtual MCSection *getStaticCtorSection(unsigned Priority, 177 const MCSymbol *KeySym) const { 178 return StaticCtorSection; 179 } 180 getStaticDtorSection(unsigned Priority,const MCSymbol * KeySym)181 virtual MCSection *getStaticDtorSection(unsigned Priority, 182 const MCSymbol *KeySym) const { 183 return StaticDtorSection; 184 } 185 186 /// Create a symbol reference to describe the given TLS variable when 187 /// emitting the address in debug info. 188 virtual const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const; 189 lowerRelativeReference(const GlobalValue * LHS,const GlobalValue * RHS,const TargetMachine & TM)190 virtual const MCExpr *lowerRelativeReference(const GlobalValue *LHS, 191 const GlobalValue *RHS, 192 const TargetMachine &TM) const { 193 return nullptr; 194 } 195 196 /// Target supports a native lowering of a dso_local_equivalent constant 197 /// without needing to replace it with equivalent IR. supportDSOLocalEquivalentLowering()198 bool supportDSOLocalEquivalentLowering() const { 199 return SupportDSOLocalEquivalentLowering; 200 } 201 lowerDSOLocalEquivalent(const DSOLocalEquivalent * Equiv,const TargetMachine & TM)202 virtual const MCExpr *lowerDSOLocalEquivalent(const DSOLocalEquivalent *Equiv, 203 const TargetMachine &TM) const { 204 return nullptr; 205 } 206 207 /// Target supports replacing a data "PC"-relative access to a symbol 208 /// through another symbol, by accessing the later via a GOT entry instead? supportIndirectSymViaGOTPCRel()209 bool supportIndirectSymViaGOTPCRel() const { 210 return SupportIndirectSymViaGOTPCRel; 211 } 212 213 /// Target GOT "PC"-relative relocation supports encoding an additional 214 /// binary expression with an offset? supportGOTPCRelWithOffset()215 bool supportGOTPCRelWithOffset() const { 216 return SupportGOTPCRelWithOffset; 217 } 218 219 /// Target supports TLS offset relocation in debug section? supportDebugThreadLocalLocation()220 bool supportDebugThreadLocalLocation() const { 221 return SupportDebugThreadLocalLocation; 222 } 223 224 /// Returns the register used as static base in RWPI variants. getStaticBase()225 virtual MCRegister getStaticBase() const { return MCRegister::NoRegister; } 226 227 /// Get the target specific RWPI relocation. getIndirectSymViaRWPI(const MCSymbol * Sym)228 virtual const MCExpr *getIndirectSymViaRWPI(const MCSymbol *Sym) const { 229 return nullptr; 230 } 231 232 /// Get the target specific PC relative GOT entry relocation getIndirectSymViaGOTPCRel(const GlobalValue * GV,const MCSymbol * Sym,const MCValue & MV,int64_t Offset,MachineModuleInfo * MMI,MCStreamer & Streamer)233 virtual const MCExpr *getIndirectSymViaGOTPCRel(const GlobalValue *GV, 234 const MCSymbol *Sym, 235 const MCValue &MV, 236 int64_t Offset, 237 MachineModuleInfo *MMI, 238 MCStreamer &Streamer) const { 239 return nullptr; 240 } 241 242 /// If supported, return the section to use for the llvm.commandline 243 /// metadata. Otherwise, return nullptr. getSectionForCommandLines()244 virtual MCSection *getSectionForCommandLines() const { 245 return nullptr; 246 } 247 248 /// On targets that use separate function descriptor symbols, return a section 249 /// for the descriptor given its symbol. Use only with defined functions. 250 virtual MCSection * getSectionForFunctionDescriptor(const Function * F,const TargetMachine & TM)251 getSectionForFunctionDescriptor(const Function *F, 252 const TargetMachine &TM) const { 253 return nullptr; 254 } 255 256 /// On targets that support TOC entries, return a section for the entry given 257 /// the symbol it refers to. 258 /// TODO: Implement this interface for existing ELF targets. getSectionForTOCEntry(const MCSymbol * S,const TargetMachine & TM)259 virtual MCSection *getSectionForTOCEntry(const MCSymbol *S, 260 const TargetMachine &TM) const { 261 return nullptr; 262 } 263 264 /// On targets that associate external references with a section, return such 265 /// a section for the given external global. 266 virtual MCSection * getSectionForExternalReference(const GlobalObject * GO,const TargetMachine & TM)267 getSectionForExternalReference(const GlobalObject *GO, 268 const TargetMachine &TM) const { 269 return nullptr; 270 } 271 272 /// Targets that have a special convention for their symbols could use 273 /// this hook to return a specialized symbol. getTargetSymbol(const GlobalValue * GV,const TargetMachine & TM)274 virtual MCSymbol *getTargetSymbol(const GlobalValue *GV, 275 const TargetMachine &TM) const { 276 return nullptr; 277 } 278 279 /// If supported, return the function entry point symbol. 280 /// Otherwise, returns nullptr. 281 /// Func must be a function or an alias which has a function as base object. getFunctionEntryPointSymbol(const GlobalValue * Func,const TargetMachine & TM)282 virtual MCSymbol *getFunctionEntryPointSymbol(const GlobalValue *Func, 283 const TargetMachine &TM) const { 284 return nullptr; 285 } 286 287 protected: 288 virtual MCSection *SelectSectionForGlobal(const GlobalObject *GO, 289 SectionKind Kind, 290 const TargetMachine &TM) const = 0; 291 }; 292 293 } // end namespace llvm 294 295 #endif // LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H 296