Initial modifications to MCAssembler and TargetMachine for the MCJIT.
[oota-llvm.git] / include / llvm / Target / TargetLoweringObjectFile.h
index 18ce1de01a00a82ff2008f531dd1dd6d2911713d..819709fa20c20488cfbb28e16b2a516e1165c3c5 100644 (file)
 #ifndef LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
 #define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
 
-// FIXME: Switch to MC.
-#include "llvm/Target/TargetAsmInfo.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/MC/SectionKind.h"
 
 namespace llvm {
+  class MachineModuleInfo;
+  class Mangler;
+  class MCAsmInfo;
+  class MCContext;
+  class MCExpr;
+  class MCSection;
+  class MCSectionMachO;
+  class MCSymbol;
+  class MCStreamer;
+  class GlobalValue;
+  class TargetMachine;
   
 class TargetLoweringObjectFile {
-private:
-  mutable StringMap<Section> Sections;
+  MCContext *Ctx;
+  
+  TargetLoweringObjectFile(const TargetLoweringObjectFile&); // DO NOT IMPLEMENT
+  void operator=(const TargetLoweringObjectFile&);           // DO NOT IMPLEMENT
 protected:
   
   TargetLoweringObjectFile();
   
   /// TextSection - Section directive for standard text.
   ///
-  const Section *TextSection;           // Defaults to ".text".
+  const MCSection *TextSection;
   
   /// DataSection - Section directive for standard data.
   ///
-  const Section *DataSection;           // Defaults to ".data".
+  const MCSection *DataSection;
   
+  /// BSSSection - Section that is default initialized to zero.
+  const MCSection *BSSSection;
   
+  /// ReadOnlySection - Section that is readonly and can contain arbitrary
+  /// initialized data.  Targets are not required to have a readonly section.
+  /// If they don't, various bits of code will fall back to using the data
+  /// section for constants.
+  const MCSection *ReadOnlySection;
   
-  // FIXME: SINK THESE.
-  const Section *BSSSection_;
+  /// StaticCtorSection - This section contains the static constructor pointer
+  /// list.
+  const MCSection *StaticCtorSection;
 
-  /// ReadOnlySection - This is the directive that is emitted to switch to a
-  /// read-only section for constant data (e.g. data declared const,
-  /// jump tables).
-  const Section *ReadOnlySection;       // Defaults to NULL
+  /// StaticDtorSection - This section contains the static destructor pointer
+  /// list.
+  const MCSection *StaticDtorSection;
+  
+  /// LSDASection - If exception handling is supported by the target, this is
+  /// the section the Language Specific Data Area information is emitted to.
+  const MCSection *LSDASection;
+  
+  /// EHFrameSection - If exception handling is supported by the target, this is
+  /// the section the EH Frame is emitted to.
+  const MCSection *EHFrameSection;
+  
+  // Dwarf sections for debug info.  If a target supports debug info, these must
+  // be set.
+  const MCSection *DwarfAbbrevSection;
+  const MCSection *DwarfInfoSection;
+  const MCSection *DwarfLineSection;
+  const MCSection *DwarfFrameSection;
+  const MCSection *DwarfPubNamesSection;
+  const MCSection *DwarfPubTypesSection;
+  const MCSection *DwarfDebugInlineSection;
+  const MCSection *DwarfStrSection;
+  const MCSection *DwarfLocSection;
+  const MCSection *DwarfARangesSection;
+  const MCSection *DwarfRangesSection;
+  const MCSection *DwarfMacroInfoSection;
+  
+  // Extra TLS Variable Data section.  If the target needs to put additional
+  // information for a TLS variable, it'll go here.
+  const MCSection *TLSExtraDataSection;
+  
+  /// SupportsWeakEmptyEHFrame - True if target object file supports a
+  /// weak_definition of constant 0 for an omitted EH frame.
+  bool SupportsWeakOmittedEHFrame;
+  
+  /// IsFunctionEHSymbolGlobal - This flag is set to true if the ".eh" symbol
+  /// for a function should be marked .globl.
+  bool IsFunctionEHSymbolGlobal;
+  
+  /// IsFunctionEHFrameSymbolPrivate - This flag is set to true if the
+  /// "EH_frame" symbol for EH information should be an assembler temporary (aka
+  /// private linkage, aka an L or .L label) or false if it should be a normal
+  /// non-.globl label.  This defaults to true.
+  bool IsFunctionEHFrameSymbolPrivate;
+public:
   
-  /// TLSDataSection - Section directive for Thread Local data.
-  ///
-  const Section *TLSDataSection;        // Defaults to ".tdata".
+  MCContext &getContext() const { return *Ctx; }
   
-  /// TLSBSSSection - Section directive for Thread Local uninitialized data.
-  /// Null if this target doesn't support a BSS section.
-  ///
-  const Section *TLSBSSSection;         // Defaults to ".tbss".
+  virtual ~TargetLoweringObjectFile();
   
-  const Section *CStringSection_;
+  /// Initialize - this method must be called before any actual lowering is
+  /// done.  This specifies the current context for codegen, and gives the
+  /// lowering implementations a chance to set up their default sections.
+  virtual void Initialize(MCContext &ctx, const TargetMachine &TM) {
+    Ctx = &ctx;
+  }
   
-public:
-  // FIXME: NONPUB.
-  const Section *getOrCreateSection(const char *Name,
-                                    bool isDirective,
-                                    SectionKind::Kind K) const;
-public:
+  bool isFunctionEHSymbolGlobal() const {
+    return IsFunctionEHSymbolGlobal;
+  }
+  bool isFunctionEHFrameSymbolPrivate() const {
+    return IsFunctionEHFrameSymbolPrivate;
+  }
+  bool getSupportsWeakOmittedEHFrame() const {
+    return SupportsWeakOmittedEHFrame;
+  }
   
-  virtual ~TargetLoweringObjectFile();
+  const MCSection *getTextSection() const { return TextSection; }
+  const MCSection *getDataSection() const { return DataSection; }
+  const MCSection *getBSSSection() const { return BSSSection; }
+  const MCSection *getStaticCtorSection() const { return StaticCtorSection; }
+  const MCSection *getStaticDtorSection() const { return StaticDtorSection; }
+  const MCSection *getLSDASection() const { return LSDASection; }
+  const MCSection *getEHFrameSection() const { return EHFrameSection; }
+  const MCSection *getDwarfAbbrevSection() const { return DwarfAbbrevSection; }
+  const MCSection *getDwarfInfoSection() const { return DwarfInfoSection; }
+  const MCSection *getDwarfLineSection() const { return DwarfLineSection; }
+  const MCSection *getDwarfFrameSection() const { return DwarfFrameSection; }
+  const MCSection *getDwarfPubNamesSection() const{return DwarfPubNamesSection;}
+  const MCSection *getDwarfPubTypesSection() const{return DwarfPubTypesSection;}
+  const MCSection *getDwarfDebugInlineSection() const {
+    return DwarfDebugInlineSection;
+  }
+  const MCSection *getDwarfStrSection() const { return DwarfStrSection; }
+  const MCSection *getDwarfLocSection() const { return DwarfLocSection; }
+  const MCSection *getDwarfARangesSection() const { return DwarfARangesSection;}
+  const MCSection *getDwarfRangesSection() const { return DwarfRangesSection; }
+  const MCSection *getDwarfMacroInfoSection() const {
+    return DwarfMacroInfoSection;
+  }
+  const MCSection *getTLSExtraDataSection() const {
+    return TLSExtraDataSection;
+  }
   
-  const Section *getTextSection() const { return TextSection; }
-  const Section *getDataSection() const { return DataSection; }
+  /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
+  /// decide not to emit the UsedDirective for some symbols in llvm.used.
+  /// FIXME: REMOVE this (rdar://7071300)
+  virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
+                                          Mangler *) const {
+    return GV != 0;
+  }
   
+  /// getSectionForConstant - Given a constant with the SectionKind, return a
+  /// section that it should be placed in.
+  virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
   
-  /// getSectionForMergeableConstant - Given a mergeable constant with the
-  /// specified size and relocation information, return a section that it
-  /// should be placed in.
-  virtual const Section *
-  getSectionForMergeableConstant(SectionKind Kind) const;
+  /// getKindForGlobal - Classify the specified global variable into a set of
+  /// target independent categories embodied in SectionKind.
+  static SectionKind getKindForGlobal(const GlobalValue *GV,
+                                      const TargetMachine &TM);
   
-  /// getKindForNamedSection - If this target wants to be able to override
-  /// section flags based on the name of the section specified for a global
-  /// variable, it can implement this.  This is used on ELF systems so that
-  /// ".tbss" gets the TLS bit set etc.
-  virtual SectionKind::Kind getKindForNamedSection(const char *Section,
-                                                   SectionKind::Kind K) const{
-    return K;
-  }
+  /// SectionForGlobal - This method computes the appropriate section to emit
+  /// the specified global variable or function definition.  This should not
+  /// be passed external (or available externally) globals.
+  const MCSection *SectionForGlobal(const GlobalValue *GV,
+                                    SectionKind Kind, Mangler *Mang,
+                                    const TargetMachine &TM) const;
   
   /// SectionForGlobal - This method computes the appropriate section to emit
   /// the specified global variable or function definition.  This should not
   /// be passed external (or available externally) globals.
-  const Section *SectionForGlobal(const GlobalValue *GV,
-                                  const TargetMachine &TM) const;
+  const MCSection *SectionForGlobal(const GlobalValue *GV,
+                                    Mangler *Mang,
+                                    const TargetMachine &TM) const {
+    return SectionForGlobal(GV, getKindForGlobal(GV, TM), Mang, TM);
+  }
+  
+  
+  
+  /// getExplicitSectionGlobal - Targets should implement this method to assign
+  /// a section to globals with an explicit section specfied.  The
+  /// implementation of this method can assume that GV->hasSection() is true.
+  virtual const MCSection *
+  getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 
+                           Mangler *Mang, const TargetMachine &TM) const = 0;
   
   /// getSpecialCasedSectionGlobals - Allow the target to completely override
   /// section assignment of a global.
-  /// FIXME: ELIMINATE this by making PIC16 implement ADDRESS with
-  /// getFlagsForNamedSection.
-  virtual const Section *
-  getSpecialCasedSectionGlobals(const GlobalValue *GV,
+  virtual const MCSection *
+  getSpecialCasedSectionGlobals(const GlobalValue *GV, Mangler *Mang,
                                 SectionKind Kind) const {
     return 0;
   }
   
-  /// getSectionFlagsAsString - Turn the flags in the specified SectionKind
-  /// into a string that can be printed to the assembly file after the
-  /// ".section foo" part of a section directive.
-  virtual void getSectionFlagsAsString(SectionKind Kind,
-                                       SmallVectorImpl<char> &Str) const {
-  }
-  
-protected:
-  virtual const Section *SelectSectionForGlobal(const GlobalValue *GV,
-                                                SectionKind Kind,
-                                                const TargetMachine &TM) const;
-};
-  
-  
-  
-
-class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
-  bool AtIsCommentChar;  // True if @ is the comment character on this target.
-public:
-  /// ELF Constructor - AtIsCommentChar is true if the CommentCharacter from TAI
-  /// is "@".
-  TargetLoweringObjectFileELF(bool AtIsCommentChar = false,
-                              // FIXME: REMOVE AFTER UNIQUING IS FIXED.
-                              bool HasCrazyBSS = false);
-  
-  /// getSectionForMergeableConstant - Given a mergeable constant with the
-  /// specified size and relocation information, return a section that it
-  /// should be placed in.
-  virtual const Section *
-  getSectionForMergeableConstant(SectionKind Kind) const;
-  
-  virtual SectionKind::Kind getKindForNamedSection(const char *Section,
-                                                   SectionKind::Kind K) const;
-  void getSectionFlagsAsString(SectionKind Kind,
-                               SmallVectorImpl<char> &Str) const;
-  
-  virtual const Section* SelectSectionForGlobal(const GlobalValue *GV,
-                                                SectionKind Kind,
-                                                const TargetMachine &TM) const;
-protected:
-  const Section *DataRelSection;
-  const Section *DataRelLocalSection;
-  const Section *DataRelROSection;
-  const Section *DataRelROLocalSection;
-  
-  const Section *MergeableConst4Section;
-  const Section *MergeableConst8Section;
-  const Section *MergeableConst16Section;
-};
-
-class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
-  const Section *TextCoalSection;
-  const Section *ConstTextCoalSection;
-  const Section *ConstDataCoalSection;
-  const Section *ConstDataSection;
-  const Section *DataCoalSection;
-  const Section *FourByteConstantSection;
-  const Section *EightByteConstantSection;
-  const Section *SixteenByteConstantSection;
-public:
-  TargetLoweringObjectFileMachO();
-  virtual const Section *SelectSectionForGlobal(const GlobalValue *GV,
-                                                SectionKind Kind,
-                                                const TargetMachine &TM) const;
-  
-  virtual const Section *
-  getSectionForMergeableConstant(SectionKind Kind) const;
-};
-
+  /// getExprForDwarfGlobalReference - Return an MCExpr to use for a reference
+  /// to the specified global variable from exception handling information.
+  ///
+  virtual const MCExpr *
+  getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
+                                 MachineModuleInfo *MMI, unsigned Encoding,
+                                 MCStreamer &Streamer) const;
 
+  /// 
+  const MCExpr *
+  getExprForDwarfReference(const MCSymbol *Sym, Mangler *Mang,
+                           MachineModuleInfo *MMI, unsigned Encoding,
+                           MCStreamer &Streamer) const;
+  
+  virtual unsigned getPersonalityEncoding() const;
+  virtual unsigned getLSDAEncoding() const;
+  virtual unsigned getFDEEncoding() const;
+  virtual unsigned getTTypeEncoding() const;
 
-class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
-public:
-  TargetLoweringObjectFileCOFF();
-  virtual void getSectionFlagsAsString(SectionKind Kind,
-                                       SmallVectorImpl<char> &Str) const;
-  
-  virtual const Section *
+protected:
+  virtual const MCSection *
   SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
-                         const TargetMachine &TM) const;
+                         Mangler *Mang, const TargetMachine &TM) const;
 };
 
 } // end namespace llvm