1 //==-- llvm/CodeGen/TargetLoweringObjectFileImpl.h - Object Info -*- C++ -*-==//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements classes used to handle lowerings specific to common
11 // object file formats.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
16 #define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/MC/SectionKind.h"
20 #include "llvm/Target/TargetLoweringObjectFile.h"
23 class MachineModuleInfo;
35 class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
37 mutable unsigned NextUniqueID = 0;
40 TargetLoweringObjectFileELF() : UseInitArray(false) {}
42 ~TargetLoweringObjectFileELF() override {}
44 void emitPersonalityValue(MCStreamer &Streamer, const TargetMachine &TM,
45 const MCSymbol *Sym) const override;
47 /// Given a constant with the SectionKind, return a section that it should be
49 MCSection *getSectionForConstant(SectionKind Kind,
50 const Constant *C) const override;
52 MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
54 const TargetMachine &TM) const override;
56 MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
58 const TargetMachine &TM) const override;
60 MCSection *getSectionForJumpTable(const Function &F, Mangler &Mang,
61 const TargetMachine &TM) const override;
63 bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
64 const Function &F) const override;
66 /// Return an MCExpr to use for a reference to the specified type info global
67 /// variable from exception handling information.
69 getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
70 Mangler &Mang, const TargetMachine &TM,
71 MachineModuleInfo *MMI,
72 MCStreamer &Streamer) const override;
74 // The symbol that gets passed to .cfi_personality.
75 MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
76 const TargetMachine &TM,
77 MachineModuleInfo *MMI) const override;
79 void InitializeELF(bool UseInitArray_);
80 MCSection *getStaticCtorSection(unsigned Priority,
81 const MCSymbol *KeySym) const override;
82 MCSection *getStaticDtorSection(unsigned Priority,
83 const MCSymbol *KeySym) const override;
88 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
90 ~TargetLoweringObjectFileMachO() override {}
91 TargetLoweringObjectFileMachO();
93 /// Extract the dependent library name from a linker option string. Returns
94 /// StringRef() if the option does not specify a library.
95 StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override;
97 /// Emit the module flags that specify the garbage collection information.
98 void emitModuleFlags(MCStreamer &Streamer,
99 ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
100 Mangler &Mang, const TargetMachine &TM) const override;
102 MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
104 const TargetMachine &TM) const override;
106 MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
108 const TargetMachine &TM) const override;
110 MCSection *getSectionForConstant(SectionKind Kind,
111 const Constant *C) const override;
113 /// The mach-o version of this method defaults to returning a stub reference.
115 getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
116 Mangler &Mang, const TargetMachine &TM,
117 MachineModuleInfo *MMI,
118 MCStreamer &Streamer) const override;
120 // The symbol that gets passed to .cfi_personality.
121 MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
122 const TargetMachine &TM,
123 MachineModuleInfo *MMI) const override;
125 /// Get MachO PC relative GOT entry relocation
126 const MCExpr *getIndirectSymViaGOTPCRel(const MCSymbol *Sym,
127 const MCValue &MV, int64_t Offset,
128 MachineModuleInfo *MMI,
129 MCStreamer &Streamer) const override;
134 class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
136 ~TargetLoweringObjectFileCOFF() override {}
138 MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
140 const TargetMachine &TM) const override;
142 MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
144 const TargetMachine &TM) const override;
146 void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
147 bool CannotUsePrivateLabel, Mangler &Mang,
148 const TargetMachine &TM) const override;
150 MCSection *getSectionForJumpTable(const Function &F, Mangler &Mang,
151 const TargetMachine &TM) const override;
153 /// Extract the dependent library name from a linker option string. Returns
154 /// StringRef() if the option does not specify a library.
155 StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override;
157 /// Emit Obj-C garbage collection and linker options. Only linker option
158 /// emission is implemented for COFF.
159 void emitModuleFlags(MCStreamer &Streamer,
160 ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
161 Mangler &Mang, const TargetMachine &TM) const override;
163 MCSection *getStaticCtorSection(unsigned Priority,
164 const MCSymbol *KeySym) const override;
165 MCSection *getStaticDtorSection(unsigned Priority,
166 const MCSymbol *KeySym) const override;
169 } // end namespace llvm