1336809Sdim//===-- llvm/Target/TargetLoweringObjectFile.h - Object Info ----*- C++ -*-===// 2336809Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6336809Sdim// 7336809Sdim//===----------------------------------------------------------------------===// 8336809Sdim// 9336809Sdim// This file implements classes used to handle lowerings specific to common 10336809Sdim// object file formats. 11336809Sdim// 12336809Sdim//===----------------------------------------------------------------------===// 13336809Sdim 14336809Sdim#ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILE_H 15336809Sdim#define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILE_H 16336809Sdim 17336809Sdim#include "llvm/ADT/ArrayRef.h" 18336809Sdim#include "llvm/ADT/StringRef.h" 19336809Sdim#include "llvm/IR/Module.h" 20336809Sdim#include "llvm/MC/MCObjectFileInfo.h" 21336809Sdim#include "llvm/MC/SectionKind.h" 22336809Sdim#include <cstdint> 23336809Sdim 24336809Sdimnamespace llvm { 25336809Sdim 26336809Sdimclass GlobalValue; 27336809Sdimclass MachineModuleInfo; 28336809Sdimclass Mangler; 29336809Sdimclass MCContext; 30336809Sdimclass MCExpr; 31336809Sdimclass MCSection; 32336809Sdimclass MCSymbol; 33336809Sdimclass MCSymbolRefExpr; 34336809Sdimclass MCStreamer; 35336809Sdimclass MCValue; 36336809Sdimclass TargetMachine; 37336809Sdim 38336809Sdimclass TargetLoweringObjectFile : public MCObjectFileInfo { 39336809Sdim MCContext *Ctx = nullptr; 40336809Sdim 41336809Sdim /// Name-mangler for global names. 42336809Sdim Mangler *Mang = nullptr; 43336809Sdim 44336809Sdimprotected: 45336809Sdim bool SupportIndirectSymViaGOTPCRel = false; 46336809Sdim bool SupportGOTPCRelWithOffset = true; 47344779Sdim bool SupportDebugThreadLocalLocation = true; 48336809Sdim 49344779Sdim /// PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values 50344779Sdim /// for EH. 51344779Sdim unsigned PersonalityEncoding = 0; 52344779Sdim unsigned LSDAEncoding = 0; 53344779Sdim unsigned TTypeEncoding = 0; 54353358Sdim unsigned CallSiteEncoding = 0; 55344779Sdim 56336809Sdim /// This section contains the static constructor pointer list. 57336809Sdim MCSection *StaticCtorSection = nullptr; 58336809Sdim 59336809Sdim /// This section contains the static destructor pointer list. 60336809Sdim MCSection *StaticDtorSection = nullptr; 61336809Sdim 62336809Sdimpublic: 63336809Sdim TargetLoweringObjectFile() = default; 64336809Sdim TargetLoweringObjectFile(const TargetLoweringObjectFile &) = delete; 65336809Sdim TargetLoweringObjectFile & 66336809Sdim operator=(const TargetLoweringObjectFile &) = delete; 67336809Sdim virtual ~TargetLoweringObjectFile(); 68336809Sdim 69336809Sdim MCContext &getContext() const { return *Ctx; } 70336809Sdim Mangler &getMangler() const { return *Mang; } 71336809Sdim 72336809Sdim /// This method must be called before any actual lowering is done. This 73336809Sdim /// specifies the current context for codegen, and gives the lowering 74336809Sdim /// implementations a chance to set up their default sections. 75336809Sdim virtual void Initialize(MCContext &ctx, const TargetMachine &TM); 76336809Sdim 77336809Sdim virtual void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &TM, 78336809Sdim const MCSymbol *Sym) const; 79336809Sdim 80336809Sdim /// Emit the module-level metadata that the platform cares about. 81336809Sdim virtual void emitModuleMetadata(MCStreamer &Streamer, Module &M) const {} 82336809Sdim 83353358Sdim /// Get the module-level metadata that the platform cares about. 84353358Sdim virtual void getModuleMetadata(Module &M) {} 85353358Sdim 86336809Sdim /// Given a constant with the SectionKind, return a section that it should be 87336809Sdim /// placed in. 88336809Sdim virtual MCSection *getSectionForConstant(const DataLayout &DL, 89336809Sdim SectionKind Kind, 90336809Sdim const Constant *C, 91336809Sdim unsigned &Align) const; 92336809Sdim 93336809Sdim /// Classify the specified global variable into a set of target independent 94336809Sdim /// categories embodied in SectionKind. 95336809Sdim static SectionKind getKindForGlobal(const GlobalObject *GO, 96336809Sdim const TargetMachine &TM); 97336809Sdim 98336809Sdim /// This method computes the appropriate section to emit the specified global 99336809Sdim /// variable or function definition. This should not be passed external (or 100336809Sdim /// available externally) globals. 101336809Sdim MCSection *SectionForGlobal(const GlobalObject *GO, SectionKind Kind, 102336809Sdim const TargetMachine &TM) const; 103336809Sdim 104336809Sdim /// This method computes the appropriate section to emit the specified global 105336809Sdim /// variable or function definition. This should not be passed external (or 106336809Sdim /// available externally) globals. 107336809Sdim MCSection *SectionForGlobal(const GlobalObject *GO, 108336809Sdim const TargetMachine &TM) const { 109336809Sdim return SectionForGlobal(GO, getKindForGlobal(GO, TM), TM); 110336809Sdim } 111336809Sdim 112336809Sdim virtual void getNameWithPrefix(SmallVectorImpl<char> &OutName, 113336809Sdim const GlobalValue *GV, 114336809Sdim const TargetMachine &TM) const; 115336809Sdim 116336809Sdim virtual MCSection *getSectionForJumpTable(const Function &F, 117336809Sdim const TargetMachine &TM) const; 118336809Sdim 119336809Sdim virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, 120336809Sdim const Function &F) const; 121336809Sdim 122336809Sdim /// Targets should implement this method to assign a section to globals with 123336809Sdim /// an explicit section specfied. The implementation of this method can 124336809Sdim /// assume that GO->hasSection() is true. 125336809Sdim virtual MCSection * 126336809Sdim getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, 127336809Sdim const TargetMachine &TM) const = 0; 128336809Sdim 129336809Sdim /// Return an MCExpr to use for a reference to the specified global variable 130336809Sdim /// from exception handling information. 131336809Sdim virtual const MCExpr *getTTypeGlobalReference(const GlobalValue *GV, 132336809Sdim unsigned Encoding, 133336809Sdim const TargetMachine &TM, 134336809Sdim MachineModuleInfo *MMI, 135336809Sdim MCStreamer &Streamer) const; 136336809Sdim 137336809Sdim /// Return the MCSymbol for a private symbol with global value name as its 138336809Sdim /// base, with the specified suffix. 139336809Sdim MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV, 140336809Sdim StringRef Suffix, 141336809Sdim const TargetMachine &TM) const; 142336809Sdim 143336809Sdim // The symbol that gets passed to .cfi_personality. 144336809Sdim virtual MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, 145336809Sdim const TargetMachine &TM, 146336809Sdim MachineModuleInfo *MMI) const; 147336809Sdim 148344779Sdim unsigned getPersonalityEncoding() const { return PersonalityEncoding; } 149344779Sdim unsigned getLSDAEncoding() const { return LSDAEncoding; } 150344779Sdim unsigned getTTypeEncoding() const { return TTypeEncoding; } 151353358Sdim unsigned getCallSiteEncoding() const { return CallSiteEncoding; } 152344779Sdim 153336809Sdim const MCExpr *getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding, 154336809Sdim MCStreamer &Streamer) const; 155336809Sdim 156336809Sdim virtual MCSection *getStaticCtorSection(unsigned Priority, 157336809Sdim const MCSymbol *KeySym) const { 158336809Sdim return StaticCtorSection; 159336809Sdim } 160336809Sdim 161336809Sdim virtual MCSection *getStaticDtorSection(unsigned Priority, 162336809Sdim const MCSymbol *KeySym) const { 163336809Sdim return StaticDtorSection; 164336809Sdim } 165336809Sdim 166336809Sdim /// Create a symbol reference to describe the given TLS variable when 167336809Sdim /// emitting the address in debug info. 168336809Sdim virtual const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const; 169336809Sdim 170336809Sdim virtual const MCExpr *lowerRelativeReference(const GlobalValue *LHS, 171336809Sdim const GlobalValue *RHS, 172336809Sdim const TargetMachine &TM) const { 173336809Sdim return nullptr; 174336809Sdim } 175336809Sdim 176336809Sdim /// Target supports replacing a data "PC"-relative access to a symbol 177336809Sdim /// through another symbol, by accessing the later via a GOT entry instead? 178336809Sdim bool supportIndirectSymViaGOTPCRel() const { 179336809Sdim return SupportIndirectSymViaGOTPCRel; 180336809Sdim } 181336809Sdim 182336809Sdim /// Target GOT "PC"-relative relocation supports encoding an additional 183336809Sdim /// binary expression with an offset? 184336809Sdim bool supportGOTPCRelWithOffset() const { 185336809Sdim return SupportGOTPCRelWithOffset; 186336809Sdim } 187336809Sdim 188344779Sdim /// Target supports TLS offset relocation in debug section? 189344779Sdim bool supportDebugThreadLocalLocation() const { 190344779Sdim return SupportDebugThreadLocalLocation; 191344779Sdim } 192344779Sdim 193336809Sdim /// Get the target specific PC relative GOT entry relocation 194360784Sdim virtual const MCExpr *getIndirectSymViaGOTPCRel(const GlobalValue *GV, 195360784Sdim const MCSymbol *Sym, 196336809Sdim const MCValue &MV, 197336809Sdim int64_t Offset, 198336809Sdim MachineModuleInfo *MMI, 199336809Sdim MCStreamer &Streamer) const { 200336809Sdim return nullptr; 201336809Sdim } 202336809Sdim 203336809Sdim virtual void emitLinkerFlagsForGlobal(raw_ostream &OS, 204336809Sdim const GlobalValue *GV) const {} 205336809Sdim 206336809Sdim virtual void emitLinkerFlagsForUsed(raw_ostream &OS, 207336809Sdim const GlobalValue *GV) const {} 208336809Sdim 209344779Sdim /// If supported, return the section to use for the llvm.commandline 210344779Sdim /// metadata. Otherwise, return nullptr. 211344779Sdim virtual MCSection *getSectionForCommandLines() const { 212344779Sdim return nullptr; 213344779Sdim } 214344779Sdim 215336809Sdimprotected: 216336809Sdim virtual MCSection *SelectSectionForGlobal(const GlobalObject *GO, 217336809Sdim SectionKind Kind, 218336809Sdim const TargetMachine &TM) const = 0; 219336809Sdim}; 220336809Sdim 221336809Sdim} // end namespace llvm 222336809Sdim 223336809Sdim#endif // LLVM_CODEGEN_TARGETLOWERINGOBJECTFILE_H 224