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