X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FTarget%2FTargetLoweringObjectFile.h;h=13a6fe37d7a94fcaa22a99d70c15bfe6721561c9;hb=e623702c22e7cee4e02332b245a417a88ae6ffff;hp=2b2d52fc6ed753499d0988d69035f396e03309d7;hpb=f9650c061ee89ac55740555530ca5c2842c28738;p=oota-llvm.git diff --git a/include/llvm/Target/TargetLoweringObjectFile.h b/include/llvm/Target/TargetLoweringObjectFile.h index 2b2d52fc6ed..13a6fe37d7a 100644 --- a/include/llvm/Target/TargetLoweringObjectFile.h +++ b/include/llvm/Target/TargetLoweringObjectFile.h @@ -15,206 +15,129 @@ #ifndef LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H #define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H -#include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/StringMap.h" +#include "llvm/Module.h" +#include "llvm/MC/MCObjectFileInfo.h" #include "llvm/MC/SectionKind.h" +#include "llvm/ADT/ArrayRef.h" namespace llvm { - class MCSection; + class MachineModuleInfo; + class Mangler; class MCContext; + class MCExpr; + class MCSection; + class MCSymbol; + class MCStreamer; class GlobalValue; - class Mangler; class TargetMachine; - -class TargetLoweringObjectFile { +class TargetLoweringObjectFile : public MCObjectFileInfo { MCContext *Ctx; -protected: - - TargetLoweringObjectFile(); - - /// TextSection - Section directive for standard text. - /// - const MCSection *TextSection; // Defaults to ".text". - - /// DataSection - Section directive for standard data. - /// - const MCSection *DataSection; // Defaults to ".data". - - - - // FIXME: SINK THESE. - const MCSection *BSSSection_; - /// 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 MCSection *ReadOnlySection; // Defaults to NULL - - /// TLSDataSection - Section directive for Thread Local data. - /// - const MCSection *TLSDataSection; // Defaults to ".tdata". - - /// TLSBSSSection - Section directive for Thread Local uninitialized data. - /// Null if this target doesn't support a BSS section. - /// - const MCSection *TLSBSSSection; // Defaults to ".tbss". - - const MCSection *CStringSection_; - -public: - // FIXME: NONPUB. - const MCSection *getOrCreateSection(const char *Name, - bool isDirective, - SectionKind K) const; + TargetLoweringObjectFile( + const TargetLoweringObjectFile&) LLVM_DELETED_FUNCTION; + void operator=(const TargetLoweringObjectFile&) LLVM_DELETED_FUNCTION; + public: + MCContext &getContext() const { return *Ctx; } + + TargetLoweringObjectFile() : MCObjectFileInfo(), Ctx(0) {} virtual ~TargetLoweringObjectFile(); /// 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; - } - - - const MCSection *getTextSection() const { return TextSection; } - const MCSection *getDataSection() const { return DataSection; } + virtual void Initialize(MCContext &ctx, const TargetMachine &TM); + virtual void emitPersonalityValue(MCStreamer &Streamer, + const TargetMachine &TM, + const MCSymbol *Sym) const; + + /// emitModuleFlags - Emit the module flags that the platform cares about. + virtual void emitModuleFlags(MCStreamer &, + ArrayRef, + Mangler *, const TargetMachine &) const { + } + /// 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); + return GV != 0; } - /// getSectionForMergeableConstant - Given a mergeable constant with the - /// specified size and relocation information, return a section that it - /// should be placed in. - virtual const MCSection * - getSectionForMergeableConstant(SectionKind Kind) const; + /// getSectionForConstant - Given a constant with the SectionKind, return a + /// section that it should be placed in. + virtual const MCSection *getSectionForConstant(SectionKind Kind) const; - /// 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 getKindForNamedSection(const char *Section, - SectionKind K) const { - return K; - } + /// 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); /// 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, - Mangler *Mang, + 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 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 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 &Str) const { - } - -protected: - virtual const MCSection * - SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, - Mangler *Mang, const TargetMachine &TM) 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; -class TargetLoweringObjectFileELF : public TargetLoweringObjectFile { - bool AtIsCommentChar; // True if @ is the comment character on this target. - bool HasCrazyBSS; -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) - : AtIsCommentChar(atIsCommentChar), HasCrazyBSS(hasCrazyBSS) {} - - virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); - - - /// getSectionForMergeableConstant - Given a mergeable constant with the - /// specified size and relocation information, return a section that it - /// should be placed in. - virtual const MCSection * - getSectionForMergeableConstant(SectionKind Kind) const; - - virtual SectionKind getKindForNamedSection(const char *Section, - SectionKind K) const; - void getSectionFlagsAsString(SectionKind Kind, - SmallVectorImpl &Str) const; - - virtual const MCSection * - SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, - Mangler *Mang, const TargetMachine &TM) const; -protected: - const MCSection *DataRelSection; - const MCSection *DataRelLocalSection; - const MCSection *DataRelROSection; - const MCSection *DataRelROLocalSection; - - const MCSection *MergeableConst4Section; - const MCSection *MergeableConst8Section; - const MCSection *MergeableConst16Section; -}; + // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality. + virtual MCSymbol * + getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, + MachineModuleInfo *MMI) const; - - -class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { - const MCSection *TextCoalSection; - const MCSection *ConstTextCoalSection; - const MCSection *ConstDataCoalSection; - const MCSection *ConstDataSection; - const MCSection *DataCoalSection; - const MCSection *FourByteConstantSection; - const MCSection *EightByteConstantSection; - const MCSection *SixteenByteConstantSection; -public: - - virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); + /// + const MCExpr * + getExprForDwarfReference(const MCSymbol *Sym, unsigned Encoding, + MCStreamer &Streamer) const; virtual const MCSection * - SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, - Mangler *Mang, const TargetMachine &TM) const; - + getStaticCtorSection(unsigned Priority = 65535) const { + (void)Priority; + return StaticCtorSection; + } virtual const MCSection * - getSectionForMergeableConstant(SectionKind Kind) const; - - /// 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; -}; - - + getStaticDtorSection(unsigned Priority = 65535) const { + (void)Priority; + return StaticDtorSection; + } -class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { -public: - virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); - - virtual void getSectionFlagsAsString(SectionKind Kind, - SmallVectorImpl &Str) const; - +protected: virtual const MCSection * SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, const TargetMachine &TM) const;