Home | History | Annotate | Download | only in CodeGen
      1 //==-- llvm/CodeGen/TargetLoweringObjectFileImpl.h - Object Info -*- C++ -*-==//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements classes used to handle lowerings specific to common
     11 // object file formats.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
     16 #define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H
     17 
     18 #include "llvm/ADT/StringRef.h"
     19 #include "llvm/MC/SectionKind.h"
     20 #include "llvm/Target/TargetLoweringObjectFile.h"
     21 
     22 namespace llvm {
     23   class MachineModuleInfo;
     24   class Mangler;
     25   class MCAsmInfo;
     26   class MCExpr;
     27   class MCSection;
     28   class MCSectionMachO;
     29   class MCSymbol;
     30   class MCContext;
     31   class GlobalValue;
     32   class TargetMachine;
     33 
     34 
     35 class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
     36   bool UseInitArray;
     37   mutable unsigned NextUniqueID = 0;
     38 
     39 public:
     40   TargetLoweringObjectFileELF() : UseInitArray(false) {}
     41 
     42   ~TargetLoweringObjectFileELF() override {}
     43 
     44   void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &TM,
     45                             const MCSymbol *Sym) const override;
     46 
     47   /// Given a constant with the SectionKind, return a section that it should be
     48   /// placed in.
     49   MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
     50                                    const Constant *C) const override;
     51 
     52   MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
     53                                       Mangler &Mang,
     54                                       const TargetMachine &TM) const override;
     55 
     56   MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
     57                                     Mangler &Mang,
     58                                     const TargetMachine &TM) const override;
     59 
     60   MCSection *getSectionForJumpTable(const Function &F, Mangler &Mang,
     61                                     const TargetMachine &TM) const override;
     62 
     63   bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference,
     64                                            const Function &F) const override;
     65 
     66   /// Return an MCExpr to use for a reference to the specified type info global
     67   /// variable from exception handling information.
     68   const MCExpr *
     69   getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
     70                           Mangler &Mang, const TargetMachine &TM,
     71                           MachineModuleInfo *MMI,
     72                           MCStreamer &Streamer) const override;
     73 
     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;
     78 
     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;
     84 };
     85 
     86 
     87 
     88 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
     89 public:
     90   ~TargetLoweringObjectFileMachO() override {}
     91   TargetLoweringObjectFileMachO();
     92 
     93   /// Emit the module flags that specify the garbage collection information.
     94   void emitModuleFlags(MCStreamer &Streamer,
     95                        ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
     96                        Mangler &Mang, const TargetMachine &TM) const override;
     97 
     98   MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
     99                                     Mangler &Mang,
    100                                     const TargetMachine &TM) const override;
    101 
    102   MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
    103                                       Mangler &Mang,
    104                                       const TargetMachine &TM) const override;
    105 
    106   MCSection *getSectionForConstant(const DataLayout &DL, SectionKind Kind,
    107                                    const Constant *C) const override;
    108 
    109   /// The mach-o version of this method defaults to returning a stub reference.
    110   const MCExpr *
    111   getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
    112                           Mangler &Mang, const TargetMachine &TM,
    113                           MachineModuleInfo *MMI,
    114                           MCStreamer &Streamer) const override;
    115 
    116   // The symbol that gets passed to .cfi_personality.
    117   MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
    118                                     const TargetMachine &TM,
    119                                     MachineModuleInfo *MMI) const override;
    120 
    121   /// Get MachO PC relative GOT entry relocation
    122   const MCExpr *getIndirectSymViaGOTPCRel(const MCSymbol *Sym,
    123                                           const MCValue &MV, int64_t Offset,
    124                                           MachineModuleInfo *MMI,
    125                                           MCStreamer &Streamer) const override;
    126 
    127   void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
    128                          Mangler &Mang, const TargetMachine &TM) const override;
    129 };
    130 
    131 
    132 
    133 class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
    134 public:
    135   ~TargetLoweringObjectFileCOFF() override {}
    136 
    137   MCSection *getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
    138                                       Mangler &Mang,
    139                                       const TargetMachine &TM) const override;
    140 
    141   MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
    142                                     Mangler &Mang,
    143                                     const TargetMachine &TM) const override;
    144 
    145   void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
    146                          Mangler &Mang, const TargetMachine &TM) const override;
    147 
    148   MCSection *getSectionForJumpTable(const Function &F, Mangler &Mang,
    149                                     const TargetMachine &TM) const override;
    150 
    151   /// Emit Obj-C garbage collection and linker options. Only linker option
    152   /// emission is implemented for COFF.
    153   void emitModuleFlags(MCStreamer &Streamer,
    154                        ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
    155                        Mangler &Mang, const TargetMachine &TM) const override;
    156 
    157   MCSection *getStaticCtorSection(unsigned Priority,
    158                                   const MCSymbol *KeySym) const override;
    159   MCSection *getStaticDtorSection(unsigned Priority,
    160                                   const MCSymbol *KeySym) const override;
    161 
    162   void emitLinkerFlagsForGlobal(raw_ostream &OS, const GlobalValue *GV,
    163                                 const Mangler &Mang) const override;
    164 };
    165 
    166 } // end namespace llvm
    167 
    168 #endif
    169