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/MC/SectionKind.h"
     19 #include "llvm/Target/TargetLoweringObjectFile.h"
     20 #include "llvm/ADT/StringRef.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   /// getExprForDwarfGlobalReference - Return an MCExpr to use for a reference
     59   /// to the specified global variable from exception handling information.
     60   ///
     61   virtual const MCExpr *
     62   getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
     63                                  MachineModuleInfo *MMI, unsigned Encoding,
     64                                  MCStreamer &Streamer) const;
     65 
     66   // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
     67   virtual MCSymbol *
     68   getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
     69                           MachineModuleInfo *MMI) const;
     70 
     71   void InitializeELF(bool UseInitArray_);
     72   virtual const MCSection *
     73   getStaticCtorSection(unsigned Priority = 65535) const;
     74   virtual const MCSection *
     75   getStaticDtorSection(unsigned Priority = 65535) const;
     76 };
     77 
     78 
     79 
     80 class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
     81 public:
     82   virtual ~TargetLoweringObjectFileMachO() {}
     83 
     84   /// emitModuleFlags - Emit the module flags that specify the garbage
     85   /// collection information.
     86   virtual void emitModuleFlags(MCStreamer &Streamer,
     87                                ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
     88                                Mangler *Mang, const TargetMachine &TM) const;
     89 
     90   virtual const MCSection *
     91   SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
     92                          Mangler *Mang, const TargetMachine &TM) const;
     93 
     94   virtual const MCSection *
     95   getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
     96                            Mangler *Mang, const TargetMachine &TM) const;
     97 
     98   virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
     99 
    100   /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
    101   /// decide not to emit the UsedDirective for some symbols in llvm.used.
    102   /// FIXME: REMOVE this (rdar://7071300)
    103   virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
    104                                           Mangler *) const;
    105 
    106   /// getExprForDwarfGlobalReference - The mach-o version of this method
    107   /// defaults to returning a stub reference.
    108   virtual const MCExpr *
    109   getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
    110                                  MachineModuleInfo *MMI, unsigned Encoding,
    111                                  MCStreamer &Streamer) const;
    112 
    113   // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
    114   virtual MCSymbol *
    115   getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
    116                           MachineModuleInfo *MMI) const;
    117 };
    118 
    119 
    120 
    121 class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
    122 public:
    123   virtual ~TargetLoweringObjectFileCOFF() {}
    124 
    125   virtual const MCSection *
    126   getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
    127                            Mangler *Mang, const TargetMachine &TM) const;
    128 
    129   virtual const MCSection *
    130   SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
    131                          Mangler *Mang, const TargetMachine &TM) const;
    132 };
    133 
    134 } // end namespace llvm
    135 
    136 #endif
    137