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 
     38 public:
     39   virtual ~TargetLoweringObjectFileELF() {}
     40 
     41   void emitPersonalityValue(MCStreamer &Streamer, const TargetMachine &TM,
     42                             const MCSymbol *Sym) const override;
     43 
     44   /// Given a constant with the SectionKind, return a section that it should be
     45   /// placed in.
     46   const MCSection *getSectionForConstant(SectionKind Kind) const override;
     47 
     48   const MCSection *getExplicitSectionGlobal(const GlobalValue *GV,
     49                                         SectionKind Kind, Mangler &Mang,
     50                                         const TargetMachine &TM) const override;
     51 
     52   const MCSection *SelectSectionForGlobal(const GlobalValue *GV,
     53                                         SectionKind Kind, Mangler &Mang,
     54                                         const TargetMachine &TM) const override;
     55 
     56   /// Return an MCExpr to use for a reference to the specified type info global
     57   /// variable from exception handling information.
     58   const MCExpr *
     59   getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
     60                           Mangler &Mang, const TargetMachine &TM,
     61                           MachineModuleInfo *MMI,
     62                           MCStreamer &Streamer) const override;
     63 
     64   // The symbol that gets passed to .cfi_personality.
     65   MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
     66                                     const TargetMachine &TM,
     67                                     MachineModuleInfo *MMI) const override;
     68 
     69   void InitializeELF(bool UseInitArray_);
     70   const MCSection *getStaticCtorSection(unsigned Priority,
     71                                         const MCSymbol *KeySym) const override;
     72   const MCSection *getStaticDtorSection(unsigned Priority,
     73                                         const MCSymbol *KeySym) const override;
     74 };
     75 
     76 
     77 
     78 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
     79 public:
     80   virtual ~TargetLoweringObjectFileMachO() {}
     81 
     82   /// Extract the dependent library name from a linker option string. Returns
     83   /// StringRef() if the option does not specify a library.
     84   StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override;
     85 
     86   /// Emit the module flags that specify the garbage collection information.
     87   void emitModuleFlags(MCStreamer &Streamer,
     88                        ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
     89                        Mangler &Mang, const TargetMachine &TM) const override;
     90 
     91   bool isSectionAtomizableBySymbols(const MCSection &Section) const override;
     92 
     93   const MCSection *
     94     SelectSectionForGlobal(const GlobalValue *GV,
     95                            SectionKind Kind, Mangler &Mang,
     96                            const TargetMachine &TM) const override;
     97 
     98   const MCSection *
     99     getExplicitSectionGlobal(const GlobalValue *GV,
    100                              SectionKind Kind, Mangler &Mang,
    101                              const TargetMachine &TM) const override;
    102 
    103   const MCSection *getSectionForConstant(SectionKind Kind) const override;
    104 
    105   /// The mach-o version of this method defaults to returning a stub reference.
    106   const MCExpr *
    107   getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
    108                           Mangler &Mang, const TargetMachine &TM,
    109                           MachineModuleInfo *MMI,
    110                           MCStreamer &Streamer) const override;
    111 
    112   // The symbol that gets passed to .cfi_personality.
    113   MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
    114                                     const TargetMachine &TM,
    115                                     MachineModuleInfo *MMI) const override;
    116 };
    117 
    118 
    119 
    120 class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
    121 public:
    122   virtual ~TargetLoweringObjectFileCOFF() {}
    123 
    124   const MCSection *
    125     getExplicitSectionGlobal(const GlobalValue *GV,
    126                              SectionKind Kind, Mangler &Mang,
    127                              const TargetMachine &TM) const override;
    128 
    129   const MCSection *
    130     SelectSectionForGlobal(const GlobalValue *GV,
    131                            SectionKind Kind, Mangler &Mang,
    132                            const TargetMachine &TM) const override;
    133 
    134   /// Extract the dependent library name from a linker option string. Returns
    135   /// StringRef() if the option does not specify a library.
    136   StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const override;
    137 
    138   /// Emit Obj-C garbage collection and linker options. Only linker option
    139   /// emission is implemented for COFF.
    140   void emitModuleFlags(MCStreamer &Streamer,
    141                        ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
    142                        Mangler &Mang, const TargetMachine &TM) const override;
    143 
    144   const MCSection *getStaticCtorSection(unsigned Priority,
    145                                         const MCSymbol *KeySym) const override;
    146   const MCSection *getStaticDtorSection(unsigned Priority,
    147                                         const MCSymbol *KeySym) const override;
    148 };
    149 
    150 } // end namespace llvm
    151 
    152 #endif
    153