mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-28 22:20:43 +00:00
Add MCObjectFileInfo and sink the MCSections initialization code from
TargetLoweringObjectFileImpl down to MCObjectFileInfo. TargetAsmInfo is done to one last method. It's *almost* gone! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135569 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
86c98145b2
commit
e76a33b956
@ -175,6 +175,7 @@ public:
|
||||
MachineModuleInfo(); // DUMMY CONSTRUCTOR, DO NOT CALL.
|
||||
// Real constructor.
|
||||
MachineModuleInfo(const MCAsmInfo &MAI, const MCRegisterInfo &MRI,
|
||||
const MCObjectFileInfo *MOFI,
|
||||
const TargetAsmInfo *TAI);
|
||||
~MachineModuleInfo();
|
||||
|
||||
|
@ -33,42 +33,13 @@ namespace llvm {
|
||||
|
||||
|
||||
class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
|
||||
protected:
|
||||
/// 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 *DataRelSection;
|
||||
const MCSection *DataRelLocalSection;
|
||||
const MCSection *DataRelROSection;
|
||||
const MCSection *DataRelROLocalSection;
|
||||
|
||||
const MCSection *MergeableConst4Section;
|
||||
const MCSection *MergeableConst8Section;
|
||||
const MCSection *MergeableConst16Section;
|
||||
public:
|
||||
TargetLoweringObjectFileELF();
|
||||
~TargetLoweringObjectFileELF() {}
|
||||
|
||||
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
|
||||
|
||||
virtual const MCSection *getEHFrameSection() const;
|
||||
virtual const MCSection *getWin64EHFuncTableSection(StringRef) const {
|
||||
return NULL;
|
||||
}
|
||||
virtual const MCSection *getWin64EHTableSection(StringRef) const{return NULL;}
|
||||
virtual ~TargetLoweringObjectFileELF() {}
|
||||
|
||||
virtual void emitPersonalityValue(MCStreamer &Streamer,
|
||||
const TargetMachine &TM,
|
||||
const MCSymbol *Sym) const;
|
||||
|
||||
const MCSection *getDataRelSection() const { return DataRelSection; }
|
||||
|
||||
/// getSectionForConstant - Given a constant with the SectionKind, return a
|
||||
/// section that it should be placed in.
|
||||
virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
|
||||
@ -99,48 +70,8 @@ public:
|
||||
|
||||
|
||||
class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
|
||||
/// TLSDataSection - Section for thread local data.
|
||||
///
|
||||
const MCSection *TLSDataSection; // Defaults to ".tdata".
|
||||
|
||||
/// TLSBSSSection - Section for thread local uninitialized data.
|
||||
///
|
||||
const MCSection *TLSBSSSection; // Defaults to ".tbss".
|
||||
|
||||
/// TLSTLVSection - Section for thread local structure information.
|
||||
/// Contains the source code name of the variable, visibility and a pointer
|
||||
/// to the initial value (.tdata or .tbss).
|
||||
const MCSection *TLSTLVSection; // Defaults to ".tlv".
|
||||
|
||||
/// TLSThreadInitSection - Section for thread local data initialization
|
||||
/// functions.
|
||||
const MCSection *TLSThreadInitSection; // Defaults to ".thread_init_func".
|
||||
|
||||
const MCSection *CStringSection;
|
||||
const MCSection *UStringSection;
|
||||
const MCSection *TextCoalSection;
|
||||
const MCSection *ConstTextCoalSection;
|
||||
const MCSection *ConstDataSection;
|
||||
const MCSection *DataCoalSection;
|
||||
const MCSection *DataCommonSection;
|
||||
const MCSection *DataBSSSection;
|
||||
const MCSection *FourByteConstantSection;
|
||||
const MCSection *EightByteConstantSection;
|
||||
const MCSection *SixteenByteConstantSection;
|
||||
|
||||
const MCSection *LazySymbolPointerSection;
|
||||
const MCSection *NonLazySymbolPointerSection;
|
||||
public:
|
||||
TargetLoweringObjectFileMachO();
|
||||
~TargetLoweringObjectFileMachO() {}
|
||||
|
||||
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
|
||||
|
||||
virtual const MCSection *getEHFrameSection() const;
|
||||
virtual const MCSection *getWin64EHFuncTableSection(StringRef) const {
|
||||
return NULL;
|
||||
}
|
||||
virtual const MCSection *getWin64EHTableSection(StringRef) const{return NULL;}
|
||||
virtual ~TargetLoweringObjectFileMachO() {}
|
||||
|
||||
virtual const MCSection *
|
||||
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
@ -158,30 +89,6 @@ public:
|
||||
virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
|
||||
Mangler *) const;
|
||||
|
||||
/// getTextCoalSection - Return the "__TEXT,__textcoal_nt" section we put weak
|
||||
/// text symbols into.
|
||||
const MCSection *getTextCoalSection() const {
|
||||
return TextCoalSection;
|
||||
}
|
||||
|
||||
/// getConstTextCoalSection - Return the "__TEXT,__const_coal" section
|
||||
/// we put weak read-only symbols into.
|
||||
const MCSection *getConstTextCoalSection() const {
|
||||
return ConstTextCoalSection;
|
||||
}
|
||||
|
||||
/// getLazySymbolPointerSection - Return the section corresponding to
|
||||
/// the .lazy_symbol_pointer directive.
|
||||
const MCSection *getLazySymbolPointerSection() const {
|
||||
return LazySymbolPointerSection;
|
||||
}
|
||||
|
||||
/// getNonLazySymbolPointerSection - Return the section corresponding to
|
||||
/// the .non_lazy_symbol_pointer directive.
|
||||
const MCSection *getNonLazySymbolPointerSection() const {
|
||||
return NonLazySymbolPointerSection;
|
||||
}
|
||||
|
||||
/// getExprForDwarfGlobalReference - The mach-o version of this method
|
||||
/// defaults to returning a stub reference.
|
||||
virtual const MCExpr *
|
||||
@ -203,20 +110,8 @@ public:
|
||||
|
||||
|
||||
class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
|
||||
const MCSection *DrectveSection;
|
||||
const MCSection *PDataSection;
|
||||
const MCSection *XDataSection;
|
||||
public:
|
||||
TargetLoweringObjectFileCOFF();
|
||||
~TargetLoweringObjectFileCOFF() {}
|
||||
|
||||
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
|
||||
|
||||
virtual const MCSection *getEHFrameSection() const;
|
||||
virtual const MCSection *getWin64EHFuncTableSection(StringRef) const;
|
||||
virtual const MCSection *getWin64EHTableSection(StringRef) const;
|
||||
|
||||
virtual const MCSection *getDrectveSection() const { return DrectveSection; }
|
||||
virtual ~TargetLoweringObjectFileCOFF() {}
|
||||
|
||||
virtual const MCSection *
|
||||
getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
|
@ -26,6 +26,7 @@ namespace llvm {
|
||||
class MCLabel;
|
||||
class MCDwarfFile;
|
||||
class MCDwarfLoc;
|
||||
class MCObjectFileInfo;
|
||||
class MCRegisterInfo;
|
||||
class MCLineSection;
|
||||
class StringRef;
|
||||
@ -50,6 +51,9 @@ namespace llvm {
|
||||
/// The MCRegisterInfo for this target.
|
||||
const MCRegisterInfo &MRI;
|
||||
|
||||
/// The MCObjectFileInfo for this target.
|
||||
const MCObjectFileInfo *MOFI;
|
||||
|
||||
const TargetAsmInfo *TAI;
|
||||
|
||||
/// Allocator - Allocator object used for creating machine code objects.
|
||||
@ -115,13 +119,15 @@ namespace llvm {
|
||||
|
||||
public:
|
||||
explicit MCContext(const MCAsmInfo &MAI, const MCRegisterInfo &MRI,
|
||||
const TargetAsmInfo *TAI);
|
||||
const MCObjectFileInfo *MOFI, const TargetAsmInfo *TAI);
|
||||
~MCContext();
|
||||
|
||||
const MCAsmInfo &getAsmInfo() const { return MAI; }
|
||||
|
||||
const MCRegisterInfo &getRegisterInfo() const { return MRI; }
|
||||
|
||||
const MCObjectFileInfo *getObjectFileInfo() const { return MOFI; }
|
||||
|
||||
const TargetAsmInfo &getTargetAsmInfo() const { return *TAI; }
|
||||
|
||||
void setAllowTemporaryLabels(bool Value) { AllowTemporaryLabels = Value; }
|
||||
|
278
include/llvm/MC/MCObjectFileInfo.h
Normal file
278
include/llvm/MC/MCObjectFileInfo.h
Normal file
@ -0,0 +1,278 @@
|
||||
//===-- llvm/MC/MCObjectFileInfo.h - Object File Info -----------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file describes common object file formats.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_MC_MCBJECTFILEINFO_H
|
||||
#define LLVM_MC_MCBJECTFILEINFO_H
|
||||
|
||||
#include "llvm/MC/MCCodeGenInfo.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/MC/SectionKind.h"
|
||||
|
||||
namespace llvm {
|
||||
class MCContext;
|
||||
class MCSection;
|
||||
class Triple;
|
||||
|
||||
class MCObjectFileInfo {
|
||||
protected:
|
||||
/// CommDirectiveSupportsAlignment - True if .comm supports alignment. This
|
||||
/// is a hack for as long as we support 10.4 Tiger, whose assembler doesn't
|
||||
/// support alignment on comm.
|
||||
bool CommDirectiveSupportsAlignment;
|
||||
|
||||
/// SupportsWeakEmptyEHFrame - True if target object file supports a
|
||||
/// weak_definition of constant 0 for an omitted EH frame.
|
||||
bool SupportsWeakOmittedEHFrame;
|
||||
|
||||
/// 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;
|
||||
|
||||
|
||||
/// TextSection - Section directive for standard text.
|
||||
///
|
||||
const MCSection *TextSection;
|
||||
|
||||
/// DataSection - Section directive for standard 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;
|
||||
|
||||
/// StaticCtorSection - This section contains the static constructor pointer
|
||||
/// list.
|
||||
const MCSection *StaticCtorSection;
|
||||
|
||||
/// 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;
|
||||
|
||||
/// CompactUnwindSection - If exception handling is supported by the target
|
||||
/// and the target can support a compact representation of the CIE and FDE,
|
||||
/// this is the section to emit them into.
|
||||
const MCSection *CompactUnwindSection;
|
||||
|
||||
// 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;
|
||||
|
||||
/// TLSDataSection - Section directive for Thread Local data.
|
||||
/// ELF and MachO only.
|
||||
const MCSection *TLSDataSection; // Defaults to ".tdata".
|
||||
|
||||
/// TLSBSSSection - Section directive for Thread Local uninitialized data.
|
||||
/// Null if this target doesn't support a BSS section.
|
||||
/// ELF and MachO only.
|
||||
const MCSection *TLSBSSSection; // Defaults to ".tbss".
|
||||
|
||||
|
||||
/// EHFrameSection - EH frame section. It is initialized on demand so it
|
||||
/// can be overwritten (with uniquing).
|
||||
const MCSection *EHFrameSection;
|
||||
|
||||
/// ELF specific sections.
|
||||
///
|
||||
const MCSection *DataRelSection;
|
||||
const MCSection *DataRelLocalSection;
|
||||
const MCSection *DataRelROSection;
|
||||
const MCSection *DataRelROLocalSection;
|
||||
const MCSection *MergeableConst4Section;
|
||||
const MCSection *MergeableConst8Section;
|
||||
const MCSection *MergeableConst16Section;
|
||||
|
||||
/// MachO specific sections.
|
||||
///
|
||||
|
||||
/// TLSTLVSection - Section for thread local structure information.
|
||||
/// Contains the source code name of the variable, visibility and a pointer
|
||||
/// to the initial value (.tdata or .tbss).
|
||||
const MCSection *TLSTLVSection; // Defaults to ".tlv".
|
||||
|
||||
/// TLSThreadInitSection - Section for thread local data initialization
|
||||
/// functions.
|
||||
const MCSection *TLSThreadInitSection; // Defaults to ".thread_init_func".
|
||||
|
||||
const MCSection *CStringSection;
|
||||
const MCSection *UStringSection;
|
||||
const MCSection *TextCoalSection;
|
||||
const MCSection *ConstTextCoalSection;
|
||||
const MCSection *ConstDataSection;
|
||||
const MCSection *DataCoalSection;
|
||||
const MCSection *DataCommonSection;
|
||||
const MCSection *DataBSSSection;
|
||||
const MCSection *FourByteConstantSection;
|
||||
const MCSection *EightByteConstantSection;
|
||||
const MCSection *SixteenByteConstantSection;
|
||||
const MCSection *LazySymbolPointerSection;
|
||||
const MCSection *NonLazySymbolPointerSection;
|
||||
|
||||
/// COFF specific sections.
|
||||
///
|
||||
const MCSection *DrectveSection;
|
||||
const MCSection *PDataSection;
|
||||
const MCSection *XDataSection;
|
||||
|
||||
public:
|
||||
void InitMCObjectFileInfo(StringRef TT, Reloc::Model RM, MCContext &ctx);
|
||||
|
||||
bool isFunctionEHFrameSymbolPrivate() const {
|
||||
return IsFunctionEHFrameSymbolPrivate;
|
||||
}
|
||||
bool getSupportsWeakOmittedEHFrame() const {
|
||||
return SupportsWeakOmittedEHFrame;
|
||||
}
|
||||
bool getCommDirectiveSupportsAlignment() const {
|
||||
return CommDirectiveSupportsAlignment;
|
||||
}
|
||||
|
||||
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 *getCompactUnwindSection() const{
|
||||
return CompactUnwindSection;
|
||||
}
|
||||
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 MCSection *getTLSDataSection() const { return TLSDataSection; }
|
||||
const MCSection *getTLSBSSSection() const { return TLSBSSSection; }
|
||||
|
||||
/// ELF specific sections.
|
||||
///
|
||||
const MCSection *getDataRelSection() const { return DataRelSection; }
|
||||
const MCSection *getDataRelLocalSection() const {
|
||||
return DataRelLocalSection;
|
||||
}
|
||||
const MCSection *getDataRelROSection() const { return DataRelROSection; }
|
||||
const MCSection *getDataRelROLocalSection() const {
|
||||
return DataRelROLocalSection;
|
||||
}
|
||||
const MCSection *getMergeableConst4Section() const {
|
||||
return MergeableConst4Section;
|
||||
}
|
||||
const MCSection *getMergeableConst8Section() const {
|
||||
return MergeableConst8Section;
|
||||
}
|
||||
const MCSection *getMergeableConst16Section() const {
|
||||
return MergeableConst16Section;
|
||||
}
|
||||
|
||||
/// MachO specific sections.
|
||||
///
|
||||
const MCSection *getTLSTLVSection() const { return TLSTLVSection; }
|
||||
const MCSection *getTLSThreadInitSection() const {
|
||||
return TLSThreadInitSection;
|
||||
}
|
||||
const MCSection *getCStringSection() const { return CStringSection; }
|
||||
const MCSection *getUStringSection() const { return UStringSection; }
|
||||
const MCSection *getTextCoalSection() const { return TextCoalSection; }
|
||||
const MCSection *getConstTextCoalSection() const {
|
||||
return ConstTextCoalSection;
|
||||
}
|
||||
const MCSection *getConstDataSection() const { return ConstDataSection; }
|
||||
const MCSection *getDataCoalSection() const { return DataCoalSection; }
|
||||
const MCSection *getDataCommonSection() const { return DataCommonSection; }
|
||||
const MCSection *getDataBSSSection() const { return DataBSSSection; }
|
||||
const MCSection *getFourByteConstantSection() const {
|
||||
return FourByteConstantSection;
|
||||
}
|
||||
const MCSection *getEightByteConstantSection() const {
|
||||
return EightByteConstantSection;
|
||||
}
|
||||
const MCSection *getSixteenByteConstantSection() const {
|
||||
return SixteenByteConstantSection;
|
||||
}
|
||||
const MCSection *getLazySymbolPointerSection() const {
|
||||
return LazySymbolPointerSection;
|
||||
}
|
||||
const MCSection *getNonLazySymbolPointerSection() const {
|
||||
return NonLazySymbolPointerSection;
|
||||
}
|
||||
|
||||
/// COFF specific sections.
|
||||
///
|
||||
const MCSection *getDrectveSection() const { return DrectveSection; }
|
||||
const MCSection *getPDataSection() const { return PDataSection; }
|
||||
const MCSection *getXDataSection() const { return XDataSection; }
|
||||
|
||||
const MCSection *getEHFrameSection() {
|
||||
if (!EHFrameSection)
|
||||
InitEHFrameSection();
|
||||
return EHFrameSection;
|
||||
}
|
||||
|
||||
private:
|
||||
enum Environment { IsMachO, IsELF, IsCOFF };
|
||||
Environment Env;
|
||||
Reloc::Model RelocM;
|
||||
MCContext *Ctx;
|
||||
|
||||
void InitMachOMCObjectFileInfo(Triple T);
|
||||
void InitELFMCObjectFileInfo(Triple T);
|
||||
void InitCOFFMCObjectFileInfo(Triple T);
|
||||
|
||||
/// InitEHFrameSection - Initialize EHFrameSection on demand.
|
||||
///
|
||||
void InitEHFrameSection();
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
@ -15,11 +15,8 @@
|
||||
#define LLVM_TARGET_TARGETASMINFO_H
|
||||
|
||||
#include "llvm/Target/TargetLoweringObjectFile.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
template <typename T> class ArrayRef;
|
||||
class MCSection;
|
||||
class TargetMachine;
|
||||
class TargetLoweringObjectFile;
|
||||
|
||||
@ -29,37 +26,9 @@ class TargetAsmInfo {
|
||||
public:
|
||||
explicit TargetAsmInfo(const TargetMachine &TM);
|
||||
|
||||
const MCSection *getDwarfLineSection() const {
|
||||
return TLOF->getDwarfLineSection();
|
||||
}
|
||||
|
||||
const MCSection *getEHFrameSection() const {
|
||||
return TLOF->getEHFrameSection();
|
||||
}
|
||||
|
||||
const MCSection *getCompactUnwindSection() const {
|
||||
return TLOF->getCompactUnwindSection();
|
||||
}
|
||||
|
||||
const MCSection *getDwarfFrameSection() const {
|
||||
return TLOF->getDwarfFrameSection();
|
||||
}
|
||||
|
||||
const MCSection *getWin64EHFuncTableSection(StringRef Suffix) const {
|
||||
return TLOF->getWin64EHFuncTableSection(Suffix);
|
||||
}
|
||||
|
||||
const MCSection *getWin64EHTableSection(StringRef Suffix) const {
|
||||
return TLOF->getWin64EHTableSection(Suffix);
|
||||
}
|
||||
|
||||
unsigned getFDEEncoding(bool CFI) const {
|
||||
return TLOF->getFDEEncoding(CFI);
|
||||
}
|
||||
|
||||
bool isFunctionEHFrameSymbolPrivate() const {
|
||||
return TLOF->isFunctionEHFrameSymbolPrivate();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -16,6 +16,7 @@
|
||||
#define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
|
||||
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/MC/MCObjectFileInfo.h"
|
||||
#include "llvm/MC/SectionKind.h"
|
||||
|
||||
namespace llvm {
|
||||
@ -31,137 +32,27 @@ namespace llvm {
|
||||
class GlobalValue;
|
||||
class TargetMachine;
|
||||
|
||||
class TargetLoweringObjectFile {
|
||||
class TargetLoweringObjectFile : public MCObjectFileInfo {
|
||||
MCContext *Ctx;
|
||||
|
||||
TargetLoweringObjectFile(const TargetLoweringObjectFile&); // DO NOT IMPLEMENT
|
||||
void operator=(const TargetLoweringObjectFile&); // DO NOT IMPLEMENT
|
||||
protected:
|
||||
|
||||
TargetLoweringObjectFile();
|
||||
|
||||
/// TextSection - Section directive for standard text.
|
||||
///
|
||||
const MCSection *TextSection;
|
||||
|
||||
/// DataSection - Section directive for standard 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;
|
||||
|
||||
/// StaticCtorSection - This section contains the static constructor pointer
|
||||
/// list.
|
||||
const MCSection *StaticCtorSection;
|
||||
|
||||
/// 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;
|
||||
|
||||
/// CompactUnwindSection - If exception handling is supported by the target
|
||||
/// and the target can support a compact representation of the CIE and FDE,
|
||||
/// this is the section to emit them into.
|
||||
const MCSection *CompactUnwindSection;
|
||||
|
||||
// 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;
|
||||
|
||||
/// CommDirectiveSupportsAlignment - True if .comm supports alignment. This
|
||||
/// is a hack for as long as we support 10.4 Tiger, whose assembler doesn't
|
||||
/// support alignment on comm.
|
||||
bool CommDirectiveSupportsAlignment;
|
||||
|
||||
/// SupportsWeakEmptyEHFrame - True if target object file supports a
|
||||
/// weak_definition of constant 0 for an omitted EH frame.
|
||||
bool SupportsWeakOmittedEHFrame;
|
||||
|
||||
/// 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:
|
||||
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;
|
||||
}
|
||||
virtual void Initialize(MCContext &ctx, const TargetMachine &TM);
|
||||
|
||||
bool isFunctionEHFrameSymbolPrivate() const {
|
||||
return IsFunctionEHFrameSymbolPrivate;
|
||||
}
|
||||
bool getSupportsWeakOmittedEHFrame() const {
|
||||
return SupportsWeakOmittedEHFrame;
|
||||
}
|
||||
bool getCommDirectiveSupportsAlignment() const {
|
||||
return CommDirectiveSupportsAlignment;
|
||||
}
|
||||
|
||||
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 *getCompactUnwindSection() const{return CompactUnwindSection;}
|
||||
virtual const MCSection *getEHFrameSection() const = 0;
|
||||
virtual void emitPersonalityValue(MCStreamer &Streamer,
|
||||
const TargetMachine &TM,
|
||||
const MCSymbol *Sym) const;
|
||||
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;
|
||||
}
|
||||
virtual const MCSection *getWin64EHFuncTableSection(StringRef suffix)const=0;
|
||||
virtual const MCSection *getWin64EHTableSection(StringRef suffix) const = 0;
|
||||
|
||||
/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
|
||||
/// decide not to emit the UsedDirective for some symbols in llvm.used.
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include "llvm/Target/Mangler.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetFrameLowering.h"
|
||||
#include "llvm/Target/TargetLoweringObjectFile.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
|
@ -77,7 +77,8 @@ void DwarfCFIException::EndModule() {
|
||||
// This is a temporary hack to keep sections in the same order they
|
||||
// were before. This lets us produce bit identical outputs while
|
||||
// transitioning to CFI.
|
||||
Asm->OutStreamer.SwitchSection(TLOF.getEHFrameSection());
|
||||
Asm->OutStreamer.SwitchSection(
|
||||
const_cast<TargetLoweringObjectFile&>(TLOF).getEHFrameSection());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -67,6 +67,7 @@ char ELFWriter::ID = 0;
|
||||
ELFWriter::ELFWriter(raw_ostream &o, TargetMachine &tm)
|
||||
: MachineFunctionPass(ID), O(o), TM(tm),
|
||||
OutContext(*new MCContext(*TM.getMCAsmInfo(), *TM.getRegisterInfo(),
|
||||
&TM.getTargetLowering()->getObjFileLowering(),
|
||||
new TargetAsmInfo(tm))),
|
||||
TLOF(TM.getTargetLowering()->getObjFileLowering()),
|
||||
is64Bit(TM.getTargetData()->getPointerSizeInBits() == 64),
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "llvm/Target/TargetAsmInfo.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Target/TargetRegistry.h"
|
||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
@ -373,7 +374,9 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,
|
||||
// all the per-module stuff we're generating, including MCContext.
|
||||
TargetAsmInfo *TAI = new TargetAsmInfo(*this);
|
||||
MachineModuleInfo *MMI = new MachineModuleInfo(*getMCAsmInfo(),
|
||||
*getRegisterInfo(), TAI);
|
||||
*getRegisterInfo(),
|
||||
&getTargetLowering()->getObjFileLowering(),
|
||||
TAI);
|
||||
PM.add(MMI);
|
||||
OutContext = &MMI->getContext(); // Return the MCContext specifically by-ref.
|
||||
|
||||
|
@ -17,9 +17,8 @@
|
||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/Target/TargetAsmInfo.h"
|
||||
#include "llvm/MC/MCObjectFileInfo.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/ADT/PointerUnion.h"
|
||||
#include "llvm/Support/Dwarf.h"
|
||||
@ -255,8 +254,9 @@ void MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {
|
||||
|
||||
MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI,
|
||||
const MCRegisterInfo &MRI,
|
||||
const MCObjectFileInfo *MOFI,
|
||||
const TargetAsmInfo *TAI)
|
||||
: ImmutablePass(ID), Context(MAI, MRI, TAI),
|
||||
: ImmutablePass(ID), Context(MAI, MRI, MOFI, TAI),
|
||||
ObjFileMMI(0), CompactUnwindEncoding(0), CurCallSite(0), CallsEHReturn(0),
|
||||
CallsUnwindInit(0), DbgInfoAvailable(false),
|
||||
CallsExternalVAFunctionWithFloatingPointArguments(false) {
|
||||
@ -268,7 +268,8 @@ MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI,
|
||||
}
|
||||
|
||||
MachineModuleInfo::MachineModuleInfo()
|
||||
: ImmutablePass(ID), Context(*(MCAsmInfo*)0, *(MCRegisterInfo*)0, NULL) {
|
||||
: ImmutablePass(ID),
|
||||
Context(*(MCAsmInfo*)0, *(MCRegisterInfo*)0, (MCObjectFileInfo*)0, NULL) {
|
||||
assert(0 && "This MachineModuleInfo constructor should never be called, MMI "
|
||||
"should always be explicitly constructed by LLVMTargetMachine");
|
||||
abort();
|
||||
|
@ -43,153 +43,6 @@ using namespace dwarf;
|
||||
// ELF
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
TargetLoweringObjectFileELF::TargetLoweringObjectFileELF()
|
||||
: TargetLoweringObjectFile(),
|
||||
TLSDataSection(0),
|
||||
TLSBSSSection(0),
|
||||
DataRelSection(0),
|
||||
DataRelLocalSection(0),
|
||||
DataRelROSection(0),
|
||||
DataRelROLocalSection(0),
|
||||
MergeableConst4Section(0),
|
||||
MergeableConst8Section(0),
|
||||
MergeableConst16Section(0) {
|
||||
}
|
||||
|
||||
void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
|
||||
const TargetMachine &TM) {
|
||||
TargetLoweringObjectFile::Initialize(Ctx, TM);
|
||||
|
||||
BSSSection =
|
||||
getContext().getELFSection(".bss", ELF::SHT_NOBITS,
|
||||
ELF::SHF_WRITE |ELF::SHF_ALLOC,
|
||||
SectionKind::getBSS());
|
||||
|
||||
TextSection =
|
||||
getContext().getELFSection(".text", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_EXECINSTR |
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getText());
|
||||
|
||||
DataSection =
|
||||
getContext().getELFSection(".data", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_WRITE |ELF::SHF_ALLOC,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
ReadOnlySection =
|
||||
getContext().getELFSection(".rodata", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
TLSDataSection =
|
||||
getContext().getELFSection(".tdata", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_TLS |
|
||||
ELF::SHF_WRITE,
|
||||
SectionKind::getThreadData());
|
||||
|
||||
TLSBSSSection =
|
||||
getContext().getELFSection(".tbss", ELF::SHT_NOBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_TLS |
|
||||
ELF::SHF_WRITE,
|
||||
SectionKind::getThreadBSS());
|
||||
|
||||
DataRelSection =
|
||||
getContext().getELFSection(".data.rel", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
DataRelLocalSection =
|
||||
getContext().getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getDataRelLocal());
|
||||
|
||||
DataRelROSection =
|
||||
getContext().getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getReadOnlyWithRel());
|
||||
|
||||
DataRelROLocalSection =
|
||||
getContext().getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getReadOnlyWithRelLocal());
|
||||
|
||||
MergeableConst4Section =
|
||||
getContext().getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_MERGE,
|
||||
SectionKind::getMergeableConst4());
|
||||
|
||||
MergeableConst8Section =
|
||||
getContext().getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_MERGE,
|
||||
SectionKind::getMergeableConst8());
|
||||
|
||||
MergeableConst16Section =
|
||||
getContext().getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_MERGE,
|
||||
SectionKind::getMergeableConst16());
|
||||
|
||||
StaticCtorSection =
|
||||
getContext().getELFSection(".ctors", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
StaticDtorSection =
|
||||
getContext().getELFSection(".dtors", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
// Exception Handling Sections.
|
||||
|
||||
// FIXME: We're emitting LSDA info into a readonly section on ELF, even though
|
||||
// it contains relocatable pointers. In PIC mode, this is probably a big
|
||||
// runtime hit for C++ apps. Either the contents of the LSDA need to be
|
||||
// adjusted or this should be a data section.
|
||||
LSDASection =
|
||||
getContext().getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getReadOnly());
|
||||
// Debug Info Sections.
|
||||
DwarfAbbrevSection =
|
||||
getContext().getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfInfoSection =
|
||||
getContext().getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLineSection =
|
||||
getContext().getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfFrameSection =
|
||||
getContext().getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubNamesSection =
|
||||
getContext().getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubTypesSection =
|
||||
getContext().getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfStrSection =
|
||||
getContext().getELFSection(".debug_str", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLocSection =
|
||||
getContext().getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfARangesSection =
|
||||
getContext().getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfRangesSection =
|
||||
getContext().getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfMacroInfoSection =
|
||||
getContext().getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileELF::getEHFrameSection() const {
|
||||
return getContext().getELFSection(".eh_frame", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
MCSymbol *
|
||||
TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
|
||||
Mangler *Mang,
|
||||
@ -493,221 +346,6 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
// MachO
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO()
|
||||
: TargetLoweringObjectFile(),
|
||||
TLSDataSection(0),
|
||||
TLSBSSSection(0),
|
||||
TLSTLVSection(0),
|
||||
TLSThreadInitSection(0),
|
||||
CStringSection(0),
|
||||
UStringSection(0),
|
||||
TextCoalSection(0),
|
||||
ConstTextCoalSection(0),
|
||||
ConstDataSection(0),
|
||||
DataCoalSection(0),
|
||||
DataCommonSection(0),
|
||||
DataBSSSection(0),
|
||||
FourByteConstantSection(0),
|
||||
EightByteConstantSection(0),
|
||||
SixteenByteConstantSection(0),
|
||||
LazySymbolPointerSection(0),
|
||||
NonLazySymbolPointerSection(0) {
|
||||
}
|
||||
|
||||
void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
|
||||
const TargetMachine &TM) {
|
||||
IsFunctionEHFrameSymbolPrivate = false;
|
||||
SupportsWeakOmittedEHFrame = false;
|
||||
|
||||
// .comm doesn't support alignment before Leopard.
|
||||
Triple T(((LLVMTargetMachine&)TM).getTargetTriple());
|
||||
if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
|
||||
CommDirectiveSupportsAlignment = false;
|
||||
|
||||
TargetLoweringObjectFile::Initialize(Ctx, TM);
|
||||
|
||||
TextSection // .text
|
||||
= getContext().getMachOSection("__TEXT", "__text",
|
||||
MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
|
||||
SectionKind::getText());
|
||||
DataSection // .data
|
||||
= getContext().getMachOSection("__DATA", "__data", 0,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
TLSDataSection // .tdata
|
||||
= getContext().getMachOSection("__DATA", "__thread_data",
|
||||
MCSectionMachO::S_THREAD_LOCAL_REGULAR,
|
||||
SectionKind::getDataRel());
|
||||
TLSBSSSection // .tbss
|
||||
= getContext().getMachOSection("__DATA", "__thread_bss",
|
||||
MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
|
||||
SectionKind::getThreadBSS());
|
||||
|
||||
// TODO: Verify datarel below.
|
||||
TLSTLVSection // .tlv
|
||||
= getContext().getMachOSection("__DATA", "__thread_vars",
|
||||
MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
TLSThreadInitSection
|
||||
= getContext().getMachOSection("__DATA", "__thread_init",
|
||||
MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
CStringSection // .cstring
|
||||
= getContext().getMachOSection("__TEXT", "__cstring",
|
||||
MCSectionMachO::S_CSTRING_LITERALS,
|
||||
SectionKind::getMergeable1ByteCString());
|
||||
UStringSection
|
||||
= getContext().getMachOSection("__TEXT","__ustring", 0,
|
||||
SectionKind::getMergeable2ByteCString());
|
||||
FourByteConstantSection // .literal4
|
||||
= getContext().getMachOSection("__TEXT", "__literal4",
|
||||
MCSectionMachO::S_4BYTE_LITERALS,
|
||||
SectionKind::getMergeableConst4());
|
||||
EightByteConstantSection // .literal8
|
||||
= getContext().getMachOSection("__TEXT", "__literal8",
|
||||
MCSectionMachO::S_8BYTE_LITERALS,
|
||||
SectionKind::getMergeableConst8());
|
||||
|
||||
// ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
|
||||
// to using it in -static mode.
|
||||
SixteenByteConstantSection = 0;
|
||||
if (TM.getRelocationModel() != Reloc::Static &&
|
||||
TM.getTargetData()->getPointerSizeInBits() == 32)
|
||||
SixteenByteConstantSection = // .literal16
|
||||
getContext().getMachOSection("__TEXT", "__literal16",
|
||||
MCSectionMachO::S_16BYTE_LITERALS,
|
||||
SectionKind::getMergeableConst16());
|
||||
|
||||
ReadOnlySection // .const
|
||||
= getContext().getMachOSection("__TEXT", "__const", 0,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
TextCoalSection
|
||||
= getContext().getMachOSection("__TEXT", "__textcoal_nt",
|
||||
MCSectionMachO::S_COALESCED |
|
||||
MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
|
||||
SectionKind::getText());
|
||||
ConstTextCoalSection
|
||||
= getContext().getMachOSection("__TEXT", "__const_coal",
|
||||
MCSectionMachO::S_COALESCED,
|
||||
SectionKind::getReadOnly());
|
||||
ConstDataSection // .const_data
|
||||
= getContext().getMachOSection("__DATA", "__const", 0,
|
||||
SectionKind::getReadOnlyWithRel());
|
||||
DataCoalSection
|
||||
= getContext().getMachOSection("__DATA","__datacoal_nt",
|
||||
MCSectionMachO::S_COALESCED,
|
||||
SectionKind::getDataRel());
|
||||
DataCommonSection
|
||||
= getContext().getMachOSection("__DATA","__common",
|
||||
MCSectionMachO::S_ZEROFILL,
|
||||
SectionKind::getBSS());
|
||||
DataBSSSection
|
||||
= getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
|
||||
SectionKind::getBSS());
|
||||
|
||||
|
||||
LazySymbolPointerSection
|
||||
= getContext().getMachOSection("__DATA", "__la_symbol_ptr",
|
||||
MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
|
||||
SectionKind::getMetadata());
|
||||
NonLazySymbolPointerSection
|
||||
= getContext().getMachOSection("__DATA", "__nl_symbol_ptr",
|
||||
MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
if (TM.getRelocationModel() == Reloc::Static) {
|
||||
StaticCtorSection
|
||||
= getContext().getMachOSection("__TEXT", "__constructor", 0,
|
||||
SectionKind::getDataRel());
|
||||
StaticDtorSection
|
||||
= getContext().getMachOSection("__TEXT", "__destructor", 0,
|
||||
SectionKind::getDataRel());
|
||||
} else {
|
||||
StaticCtorSection
|
||||
= getContext().getMachOSection("__DATA", "__mod_init_func",
|
||||
MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
|
||||
SectionKind::getDataRel());
|
||||
StaticDtorSection
|
||||
= getContext().getMachOSection("__DATA", "__mod_term_func",
|
||||
MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
// Exception Handling.
|
||||
LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0,
|
||||
SectionKind::getReadOnlyWithRel());
|
||||
|
||||
if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
|
||||
CompactUnwindSection =
|
||||
getContext().getMachOSection("__LD", "__compact_unwind",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
// Debug Information.
|
||||
DwarfAbbrevSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_abbrev",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfInfoSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_info",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLineSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_line",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfFrameSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_frame",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubNamesSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_pubnames",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubTypesSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_pubtypes",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfStrSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_str",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLocSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_loc",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfARangesSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_aranges",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfRangesSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_ranges",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfMacroInfoSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_macinfo",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfDebugInlineSection =
|
||||
getContext().getMachOSection("__DWARF", "__debug_inlined",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
TLSExtraDataSection = TLSTLVSection;
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileMachO::getEHFrameSection() const {
|
||||
return getContext().getMachOSection("__TEXT", "__eh_frame",
|
||||
MCSectionMachO::S_COALESCED |
|
||||
MCSectionMachO::S_ATTR_NO_TOC |
|
||||
MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
|
||||
MCSectionMachO::S_ATTR_LIVE_SUPPORT,
|
||||
SectionKind::getReadOnly());
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileMachO::
|
||||
getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||
Mangler *Mang, const TargetMachine &TM) const {
|
||||
@ -925,163 +563,6 @@ unsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
|
||||
// COFF
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
TargetLoweringObjectFileCOFF::TargetLoweringObjectFileCOFF()
|
||||
: TargetLoweringObjectFile(),
|
||||
DrectveSection(0),
|
||||
PDataSection(0),
|
||||
XDataSection(0) {
|
||||
}
|
||||
|
||||
void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
|
||||
const TargetMachine &TM) {
|
||||
TargetLoweringObjectFile::Initialize(Ctx, TM);
|
||||
TextSection =
|
||||
getContext().getCOFFSection(".text",
|
||||
COFF::IMAGE_SCN_CNT_CODE |
|
||||
COFF::IMAGE_SCN_MEM_EXECUTE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getText());
|
||||
DataSection =
|
||||
getContext().getCOFFSection(".data",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
ReadOnlySection =
|
||||
getContext().getCOFFSection(".rdata",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
StaticCtorSection =
|
||||
getContext().getCOFFSection(".ctors",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
StaticDtorSection =
|
||||
getContext().getCOFFSection(".dtors",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
// FIXME: We're emitting LSDA info into a readonly section on COFF, even
|
||||
// though it contains relocatable pointers. In PIC mode, this is probably a
|
||||
// big runtime hit for C++ apps. Either the contents of the LSDA need to be
|
||||
// adjusted or this should be a data section.
|
||||
LSDASection =
|
||||
getContext().getCOFFSection(".gcc_except_table",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
// Debug info.
|
||||
DwarfAbbrevSection =
|
||||
getContext().getCOFFSection(".debug_abbrev",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfInfoSection =
|
||||
getContext().getCOFFSection(".debug_info",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLineSection =
|
||||
getContext().getCOFFSection(".debug_line",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfFrameSection =
|
||||
getContext().getCOFFSection(".debug_frame",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubNamesSection =
|
||||
getContext().getCOFFSection(".debug_pubnames",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubTypesSection =
|
||||
getContext().getCOFFSection(".debug_pubtypes",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfStrSection =
|
||||
getContext().getCOFFSection(".debug_str",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLocSection =
|
||||
getContext().getCOFFSection(".debug_loc",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfARangesSection =
|
||||
getContext().getCOFFSection(".debug_aranges",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfRangesSection =
|
||||
getContext().getCOFFSection(".debug_ranges",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfMacroInfoSection =
|
||||
getContext().getCOFFSection(".debug_macinfo",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
DrectveSection =
|
||||
getContext().getCOFFSection(".drectve",
|
||||
COFF::IMAGE_SCN_LNK_INFO,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
PDataSection =
|
||||
getContext().getCOFFSection(".pdata",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
XDataSection =
|
||||
getContext().getCOFFSection(".xdata",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileCOFF::getEHFrameSection() const {
|
||||
return getContext().getCOFFSection(".eh_frame",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileCOFF::getWin64EHFuncTableSection(
|
||||
StringRef suffix) const {
|
||||
if (suffix == "")
|
||||
return PDataSection;
|
||||
return getContext().getCOFFSection((".pdata"+suffix).str(),
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
const MCSection *TargetLoweringObjectFileCOFF::getWin64EHTableSection(
|
||||
StringRef suffix) const {
|
||||
if (suffix == "")
|
||||
return XDataSection;
|
||||
return getContext().getCOFFSection((".xdata"+suffix).str(),
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
|
||||
static unsigned
|
||||
getCOFFSectionFlags(SectionKind K) {
|
||||
unsigned Flags = 0;
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCInstPrinter.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCSectionCOFF.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/ADT/OwningPtr.h"
|
||||
@ -995,6 +996,19 @@ void MCAsmStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind,
|
||||
EmitEOL();
|
||||
}
|
||||
|
||||
static const MCSection *getWin64EHTableSection(StringRef suffix,
|
||||
MCContext &context) {
|
||||
// FIXME: This doesn't belong in MCObjectFileInfo. However,
|
||||
/// this duplicate code in MCWin64EH.cpp.
|
||||
if (suffix == "")
|
||||
return context.getObjectFileInfo()->getXDataSection();
|
||||
return context.getCOFFSection((".xdata"+suffix).str(),
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
void MCAsmStreamer::EmitWin64EHHandlerData() {
|
||||
MCStreamer::EmitWin64EHHandlerData();
|
||||
|
||||
@ -1004,8 +1018,7 @@ void MCAsmStreamer::EmitWin64EHHandlerData() {
|
||||
// data block is visible.
|
||||
MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo();
|
||||
StringRef suffix=MCWin64EHUnwindEmitter::GetSectionSuffix(CurFrame->Function);
|
||||
const MCSection *xdataSect =
|
||||
getContext().getTargetAsmInfo().getWin64EHTableSection(suffix);
|
||||
const MCSection *xdataSect = getWin64EHTableSection(suffix, getContext());
|
||||
if (xdataSect)
|
||||
SwitchSectionNoChange(xdataSect);
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCObjectFileInfo.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCSectionELF.h"
|
||||
@ -28,8 +29,8 @@ typedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
|
||||
|
||||
|
||||
MCContext::MCContext(const MCAsmInfo &mai, const MCRegisterInfo &mri,
|
||||
const TargetAsmInfo *tai) :
|
||||
MAI(mai), MRI(mri), TAI(tai),
|
||||
const MCObjectFileInfo *mofi, const TargetAsmInfo *tai) :
|
||||
MAI(mai), MRI(mri), MOFI(mofi), TAI(tai),
|
||||
Allocator(), Symbols(Allocator), UsedNames(Allocator),
|
||||
NextUniqueID(0),
|
||||
CurrentDwarfLoc(0,0,0,DWARF2_FLAG_IS_STMT,0,0),
|
||||
|
@ -75,7 +75,7 @@ LLVMDisasmContextRef LLVMCreateDisasm(const char *TripleName, void *DisInfo,
|
||||
assert(tai && "Unable to create target assembler!");
|
||||
|
||||
// Set up the MCContext for creating symbols and MCExpr's.
|
||||
MCContext *Ctx = new MCContext(*MAI, *MRI, tai);
|
||||
MCContext *Ctx = new MCContext(*MAI, *MRI, 0, tai);
|
||||
assert(Ctx && "Unable to create MCContext!");
|
||||
|
||||
// Set up disassembler.
|
||||
|
@ -377,7 +377,7 @@ int EDDisassembler::parseInst(SmallVectorImpl<MCParsedAsmOperand*> &operands,
|
||||
SourceMgr sourceMgr;
|
||||
sourceMgr.setDiagHandler(diag_handler, static_cast<void*>(this));
|
||||
sourceMgr.AddNewSourceBuffer(buf, SMLoc()); // ownership of buf handed over
|
||||
MCContext context(*AsmInfo, *MRI, NULL);
|
||||
MCContext context(*AsmInfo, *MRI, NULL, NULL);
|
||||
OwningPtr<MCStreamer> streamer(createNullStreamer(context));
|
||||
OwningPtr<MCAsmParser> genericParser(createMCAsmParser(*Tgt, sourceMgr,
|
||||
context, *streamer,
|
||||
|
@ -7,13 +7,15 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCDwarf.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCObjectFileInfo.h"
|
||||
#include "llvm/MC/MCObjectWriter.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCObjectWriter.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -196,7 +198,7 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
|
||||
MCOS->EmitLabel(SectionEnd);
|
||||
|
||||
// Switch back the the dwarf line section.
|
||||
MCOS->SwitchSection(context.getTargetAsmInfo().getDwarfLineSection());
|
||||
MCOS->SwitchSection(context.getObjectFileInfo()->getDwarfLineSection());
|
||||
|
||||
const MCAsmInfo &asmInfo = MCOS->getContext().getAsmInfo();
|
||||
MCOS->EmitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd,
|
||||
@ -209,7 +211,7 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
|
||||
void MCDwarfFileTable::Emit(MCStreamer *MCOS) {
|
||||
MCContext &context = MCOS->getContext();
|
||||
// Switch to the section where the table will be emitted into.
|
||||
MCOS->SwitchSection(context.getTargetAsmInfo().getDwarfLineSection());
|
||||
MCOS->SwitchSection(context.getObjectFileInfo()->getDwarfLineSection());
|
||||
|
||||
// Create a symbol at the beginning of this section.
|
||||
MCSymbol *LineStartSym = context.CreateTempSymbol();
|
||||
@ -688,6 +690,7 @@ void FrameEmitterImpl::EmitCFIInstructions(MCStreamer &streamer,
|
||||
bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
|
||||
const MCDwarfFrameInfo &Frame) {
|
||||
MCContext &Context = Streamer.getContext();
|
||||
const MCObjectFileInfo *MOFI = Context.getObjectFileInfo();
|
||||
const TargetAsmInfo &TAI = Context.getTargetAsmInfo();
|
||||
bool VerboseAsm = Streamer.isVerboseAsm();
|
||||
|
||||
@ -720,7 +723,7 @@ bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
|
||||
if (Frame.Lsda)
|
||||
Encoding |= 0x40000000;
|
||||
|
||||
Streamer.SwitchSection(TAI.getCompactUnwindSection());
|
||||
Streamer.SwitchSection(MOFI->getCompactUnwindSection());
|
||||
|
||||
// Range Start
|
||||
unsigned FDEEncoding = TAI.getFDEEncoding(UsingCFI);
|
||||
@ -767,11 +770,12 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
|
||||
unsigned lsdaEncoding) {
|
||||
MCContext &context = streamer.getContext();
|
||||
const MCRegisterInfo &MRI = context.getRegisterInfo();
|
||||
const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
|
||||
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
||||
bool verboseAsm = streamer.isVerboseAsm();
|
||||
|
||||
MCSymbol *sectionStart;
|
||||
if (TAI.isFunctionEHFrameSymbolPrivate() || !IsEH)
|
||||
if (MOFI->isFunctionEHFrameSymbolPrivate() || !IsEH)
|
||||
sectionStart = context.CreateTempSymbol();
|
||||
else
|
||||
sectionStart = context.GetOrCreateSymbol(Twine("EH_frame") + Twine(CIENum));
|
||||
@ -890,10 +894,11 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
|
||||
MCContext &context = streamer.getContext();
|
||||
MCSymbol *fdeStart = context.CreateTempSymbol();
|
||||
MCSymbol *fdeEnd = context.CreateTempSymbol();
|
||||
const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
|
||||
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
||||
bool verboseAsm = streamer.isVerboseAsm();
|
||||
|
||||
if (!TAI.isFunctionEHFrameSymbolPrivate() && IsEH) {
|
||||
if (!MOFI->isFunctionEHFrameSymbolPrivate() && IsEH) {
|
||||
MCSymbol *EHSym =
|
||||
context.GetOrCreateSymbol(frame.Function->getName() + Twine(".eh"));
|
||||
streamer.EmitEHSymAttributes(frame.Function, EHSym);
|
||||
@ -1008,9 +1013,10 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer,
|
||||
bool UsingCFI,
|
||||
bool IsEH) {
|
||||
MCContext &Context = Streamer.getContext();
|
||||
const TargetAsmInfo &TAI = Context.getTargetAsmInfo();
|
||||
const MCSection &Section = IsEH ? *TAI.getEHFrameSection() :
|
||||
*TAI.getDwarfFrameSection();
|
||||
MCObjectFileInfo *MOFI =
|
||||
const_cast<MCObjectFileInfo*>(Context.getObjectFileInfo());
|
||||
const MCSection &Section = IsEH ? *MOFI->getEHFrameSection() :
|
||||
*MOFI->getDwarfFrameSection();
|
||||
Streamer.SwitchSection(&Section);
|
||||
MCSymbol *SectionStart = Context.CreateTempSymbol();
|
||||
Streamer.EmitLabel(SectionStart);
|
||||
@ -1022,7 +1028,8 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer,
|
||||
const MCSymbol *DummyDebugKey = NULL;
|
||||
for (unsigned i = 0, n = Streamer.getNumFrameInfos(); i < n; ++i) {
|
||||
const MCDwarfFrameInfo &Frame = Streamer.getFrameInfo(i);
|
||||
if (IsEH && TAI.getCompactUnwindSection() && Frame.CompactUnwindEncoding &&
|
||||
if (IsEH && MOFI->getCompactUnwindSection() &&
|
||||
Frame.CompactUnwindEncoding &&
|
||||
Emitter.EmitCompactUnwind(Streamer, Frame)) {
|
||||
FDEEnd = NULL;
|
||||
continue;
|
||||
|
500
lib/MC/MCObjectFileInfo.cpp
Normal file
500
lib/MC/MCObjectFileInfo.cpp
Normal file
@ -0,0 +1,500 @@
|
||||
//===-- MObjectFileInfo.cpp - Object File Information ---------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/MC/MCObjectFileInfo.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCSection.h"
|
||||
#include "llvm/MC/MCSectionCOFF.h"
|
||||
#include "llvm/MC/MCSectionELF.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
using namespace llvm;
|
||||
|
||||
void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
|
||||
// MachO
|
||||
IsFunctionEHFrameSymbolPrivate = false;
|
||||
SupportsWeakOmittedEHFrame = false;
|
||||
|
||||
// .comm doesn't support alignment before Leopard.
|
||||
if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
|
||||
CommDirectiveSupportsAlignment = false;
|
||||
|
||||
TextSection // .text
|
||||
= Ctx->getMachOSection("__TEXT", "__text",
|
||||
MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
|
||||
SectionKind::getText());
|
||||
DataSection // .data
|
||||
= Ctx->getMachOSection("__DATA", "__data", 0,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
TLSDataSection // .tdata
|
||||
= Ctx->getMachOSection("__DATA", "__thread_data",
|
||||
MCSectionMachO::S_THREAD_LOCAL_REGULAR,
|
||||
SectionKind::getDataRel());
|
||||
TLSBSSSection // .tbss
|
||||
= Ctx->getMachOSection("__DATA", "__thread_bss",
|
||||
MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
|
||||
SectionKind::getThreadBSS());
|
||||
|
||||
// TODO: Verify datarel below.
|
||||
TLSTLVSection // .tlv
|
||||
= Ctx->getMachOSection("__DATA", "__thread_vars",
|
||||
MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
TLSThreadInitSection
|
||||
= Ctx->getMachOSection("__DATA", "__thread_init",
|
||||
MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
CStringSection // .cstring
|
||||
= Ctx->getMachOSection("__TEXT", "__cstring",
|
||||
MCSectionMachO::S_CSTRING_LITERALS,
|
||||
SectionKind::getMergeable1ByteCString());
|
||||
UStringSection
|
||||
= Ctx->getMachOSection("__TEXT","__ustring", 0,
|
||||
SectionKind::getMergeable2ByteCString());
|
||||
FourByteConstantSection // .literal4
|
||||
= Ctx->getMachOSection("__TEXT", "__literal4",
|
||||
MCSectionMachO::S_4BYTE_LITERALS,
|
||||
SectionKind::getMergeableConst4());
|
||||
EightByteConstantSection // .literal8
|
||||
= Ctx->getMachOSection("__TEXT", "__literal8",
|
||||
MCSectionMachO::S_8BYTE_LITERALS,
|
||||
SectionKind::getMergeableConst8());
|
||||
|
||||
// ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
|
||||
// to using it in -static mode.
|
||||
SixteenByteConstantSection = 0;
|
||||
if (RelocM != Reloc::Static &&
|
||||
T.getArch() != Triple::x86_64 && T.getArch() != Triple::ppc64)
|
||||
SixteenByteConstantSection = // .literal16
|
||||
Ctx->getMachOSection("__TEXT", "__literal16",
|
||||
MCSectionMachO::S_16BYTE_LITERALS,
|
||||
SectionKind::getMergeableConst16());
|
||||
|
||||
ReadOnlySection // .const
|
||||
= Ctx->getMachOSection("__TEXT", "__const", 0,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
TextCoalSection
|
||||
= Ctx->getMachOSection("__TEXT", "__textcoal_nt",
|
||||
MCSectionMachO::S_COALESCED |
|
||||
MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
|
||||
SectionKind::getText());
|
||||
ConstTextCoalSection
|
||||
= Ctx->getMachOSection("__TEXT", "__const_coal",
|
||||
MCSectionMachO::S_COALESCED,
|
||||
SectionKind::getReadOnly());
|
||||
ConstDataSection // .const_data
|
||||
= Ctx->getMachOSection("__DATA", "__const", 0,
|
||||
SectionKind::getReadOnlyWithRel());
|
||||
DataCoalSection
|
||||
= Ctx->getMachOSection("__DATA","__datacoal_nt",
|
||||
MCSectionMachO::S_COALESCED,
|
||||
SectionKind::getDataRel());
|
||||
DataCommonSection
|
||||
= Ctx->getMachOSection("__DATA","__common",
|
||||
MCSectionMachO::S_ZEROFILL,
|
||||
SectionKind::getBSS());
|
||||
DataBSSSection
|
||||
= Ctx->getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
|
||||
SectionKind::getBSS());
|
||||
|
||||
|
||||
LazySymbolPointerSection
|
||||
= Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
|
||||
MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
|
||||
SectionKind::getMetadata());
|
||||
NonLazySymbolPointerSection
|
||||
= Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
|
||||
MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
if (RelocM == Reloc::Static) {
|
||||
StaticCtorSection
|
||||
= Ctx->getMachOSection("__TEXT", "__constructor", 0,
|
||||
SectionKind::getDataRel());
|
||||
StaticDtorSection
|
||||
= Ctx->getMachOSection("__TEXT", "__destructor", 0,
|
||||
SectionKind::getDataRel());
|
||||
} else {
|
||||
StaticCtorSection
|
||||
= Ctx->getMachOSection("__DATA", "__mod_init_func",
|
||||
MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
|
||||
SectionKind::getDataRel());
|
||||
StaticDtorSection
|
||||
= Ctx->getMachOSection("__DATA", "__mod_term_func",
|
||||
MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
// Exception Handling.
|
||||
LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
|
||||
SectionKind::getReadOnlyWithRel());
|
||||
|
||||
if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
|
||||
CompactUnwindSection =
|
||||
Ctx->getMachOSection("__LD", "__compact_unwind",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
// Debug Information.
|
||||
DwarfAbbrevSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_abbrev",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfInfoSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_info",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLineSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_line",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfFrameSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_frame",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubNamesSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_pubnames",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubTypesSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_pubtypes",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfStrSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_str",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLocSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_loc",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfARangesSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_aranges",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfRangesSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_ranges",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfMacroInfoSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_macinfo",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
DwarfDebugInlineSection =
|
||||
Ctx->getMachOSection("__DWARF", "__debug_inlined",
|
||||
MCSectionMachO::S_ATTR_DEBUG,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
TLSExtraDataSection = TLSTLVSection;
|
||||
}
|
||||
|
||||
void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) {
|
||||
// ELF
|
||||
BSSSection =
|
||||
Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
|
||||
ELF::SHF_WRITE |ELF::SHF_ALLOC,
|
||||
SectionKind::getBSS());
|
||||
|
||||
TextSection =
|
||||
Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_EXECINSTR |
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getText());
|
||||
|
||||
DataSection =
|
||||
Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_WRITE |ELF::SHF_ALLOC,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
ReadOnlySection =
|
||||
Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
TLSDataSection =
|
||||
Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_TLS |
|
||||
ELF::SHF_WRITE,
|
||||
SectionKind::getThreadData());
|
||||
|
||||
TLSBSSSection =
|
||||
Ctx->getELFSection(".tbss", ELF::SHT_NOBITS,
|
||||
ELF::SHF_ALLOC | ELF::SHF_TLS |
|
||||
ELF::SHF_WRITE,
|
||||
SectionKind::getThreadBSS());
|
||||
|
||||
DataRelSection =
|
||||
Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
DataRelLocalSection =
|
||||
Ctx->getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getDataRelLocal());
|
||||
|
||||
DataRelROSection =
|
||||
Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getReadOnlyWithRel());
|
||||
|
||||
DataRelROLocalSection =
|
||||
Ctx->getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getReadOnlyWithRelLocal());
|
||||
|
||||
MergeableConst4Section =
|
||||
Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_MERGE,
|
||||
SectionKind::getMergeableConst4());
|
||||
|
||||
MergeableConst8Section =
|
||||
Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_MERGE,
|
||||
SectionKind::getMergeableConst8());
|
||||
|
||||
MergeableConst16Section =
|
||||
Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_MERGE,
|
||||
SectionKind::getMergeableConst16());
|
||||
|
||||
StaticCtorSection =
|
||||
Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
StaticDtorSection =
|
||||
Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC |ELF::SHF_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
// Exception Handling Sections.
|
||||
|
||||
// FIXME: We're emitting LSDA info into a readonly section on ELF, even though
|
||||
// it contains relocatable pointers. In PIC mode, this is probably a big
|
||||
// runtime hit for C++ apps. Either the contents of the LSDA need to be
|
||||
// adjusted or this should be a data section.
|
||||
LSDASection =
|
||||
Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
// Debug Info Sections.
|
||||
DwarfAbbrevSection =
|
||||
Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfInfoSection =
|
||||
Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLineSection =
|
||||
Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfFrameSection =
|
||||
Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubNamesSection =
|
||||
Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubTypesSection =
|
||||
Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfStrSection =
|
||||
Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLocSection =
|
||||
Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfARangesSection =
|
||||
Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfRangesSection =
|
||||
Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
DwarfMacroInfoSection =
|
||||
Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
|
||||
SectionKind::getMetadata());
|
||||
}
|
||||
|
||||
|
||||
void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) {
|
||||
// COFF
|
||||
TextSection =
|
||||
Ctx->getCOFFSection(".text",
|
||||
COFF::IMAGE_SCN_CNT_CODE |
|
||||
COFF::IMAGE_SCN_MEM_EXECUTE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getText());
|
||||
DataSection =
|
||||
Ctx->getCOFFSection(".data",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
ReadOnlySection =
|
||||
Ctx->getCOFFSection(".rdata",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
StaticCtorSection =
|
||||
Ctx->getCOFFSection(".ctors",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
StaticDtorSection =
|
||||
Ctx->getCOFFSection(".dtors",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
// FIXME: We're emitting LSDA info into a readonly section on COFF, even
|
||||
// though it contains relocatable pointers. In PIC mode, this is probably a
|
||||
// big runtime hit for C++ apps. Either the contents of the LSDA need to be
|
||||
// adjusted or this should be a data section.
|
||||
LSDASection =
|
||||
Ctx->getCOFFSection(".gcc_except_table",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
// Debug info.
|
||||
DwarfAbbrevSection =
|
||||
Ctx->getCOFFSection(".debug_abbrev",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfInfoSection =
|
||||
Ctx->getCOFFSection(".debug_info",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLineSection =
|
||||
Ctx->getCOFFSection(".debug_line",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfFrameSection =
|
||||
Ctx->getCOFFSection(".debug_frame",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubNamesSection =
|
||||
Ctx->getCOFFSection(".debug_pubnames",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfPubTypesSection =
|
||||
Ctx->getCOFFSection(".debug_pubtypes",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfStrSection =
|
||||
Ctx->getCOFFSection(".debug_str",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfLocSection =
|
||||
Ctx->getCOFFSection(".debug_loc",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfARangesSection =
|
||||
Ctx->getCOFFSection(".debug_aranges",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfRangesSection =
|
||||
Ctx->getCOFFSection(".debug_ranges",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
DwarfMacroInfoSection =
|
||||
Ctx->getCOFFSection(".debug_macinfo",
|
||||
COFF::IMAGE_SCN_MEM_DISCARDABLE |
|
||||
COFF::IMAGE_SCN_MEM_READ,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
DrectveSection =
|
||||
Ctx->getCOFFSection(".drectve",
|
||||
COFF::IMAGE_SCN_LNK_INFO,
|
||||
SectionKind::getMetadata());
|
||||
|
||||
PDataSection =
|
||||
Ctx->getCOFFSection(".pdata",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
XDataSection =
|
||||
Ctx->getCOFFSection(".xdata",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
|
||||
MCContext &ctx) {
|
||||
RelocM = relocm;
|
||||
Ctx = &ctx;
|
||||
|
||||
// Common.
|
||||
CommDirectiveSupportsAlignment = true;
|
||||
SupportsWeakOmittedEHFrame = true;
|
||||
IsFunctionEHFrameSymbolPrivate = true;
|
||||
|
||||
Triple T(TT);
|
||||
Triple::ArchType Arch = T.getArch();
|
||||
// FIXME: Checking for Arch here to filter out bogus triples such as
|
||||
// cellspu-apple-darwin. Perhaps we should fix in Triple?
|
||||
if ((Arch == Triple::x86 || Arch == Triple::x86_64 ||
|
||||
Arch == Triple::arm || Arch == Triple::thumb ||
|
||||
Arch == Triple::ppc || Arch == Triple::ppc64 ||
|
||||
Arch == Triple::UnknownArch) &&
|
||||
(T.isOSDarwin() || T.getEnvironment() == Triple::MachO)) {
|
||||
Env = IsMachO;
|
||||
InitMachOMCObjectFileInfo(T);
|
||||
} else if (T.getOS() == Triple::MinGW32 || T.getOS() == Triple::Cygwin ||
|
||||
T.getOS() == Triple::Win32) {
|
||||
Env = IsCOFF;
|
||||
InitCOFFMCObjectFileInfo(T);
|
||||
} else {
|
||||
Env = IsELF;
|
||||
InitELFMCObjectFileInfo(T);
|
||||
}
|
||||
}
|
||||
|
||||
void MCObjectFileInfo::InitEHFrameSection() {
|
||||
if (Env == IsMachO)
|
||||
EHFrameSection =
|
||||
Ctx->getMachOSection("__TEXT", "__eh_frame",
|
||||
MCSectionMachO::S_COALESCED |
|
||||
MCSectionMachO::S_ATTR_NO_TOC |
|
||||
MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
|
||||
MCSectionMachO::S_ATTR_LIVE_SUPPORT,
|
||||
SectionKind::getReadOnly());
|
||||
else if (Env == IsELF)
|
||||
EHFrameSection =
|
||||
Ctx->getELFSection(".eh_frame", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getDataRel());
|
||||
else
|
||||
EHFrameSection =
|
||||
Ctx->getCOFFSection(".eh_frame",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
@ -23,6 +23,7 @@
|
||||
#include "llvm/MC/MCParser/AsmLexer.h"
|
||||
#include "llvm/MC/MCParser/MCAsmParser.h"
|
||||
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
|
@ -10,10 +10,11 @@
|
||||
#include "llvm/MC/MCWin64EH.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCObjectFileInfo.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/MC/MCSectionCOFF.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/Target/TargetAsmInfo.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -220,14 +221,36 @@ StringRef MCWin64EHUnwindEmitter::GetSectionSuffix(const MCSymbol *func) {
|
||||
return "";
|
||||
}
|
||||
|
||||
static const MCSection *getWin64EHTableSection(StringRef suffix,
|
||||
MCContext &context) {
|
||||
if (suffix == "")
|
||||
return context.getObjectFileInfo()->getXDataSection();
|
||||
|
||||
return context.getCOFFSection((".xdata"+suffix).str(),
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
static const MCSection *getWin64EHFuncTableSection(StringRef suffix,
|
||||
MCContext &context) {
|
||||
if (suffix == "")
|
||||
return context.getObjectFileInfo()->getPDataSection();
|
||||
return context.getCOFFSection((".pdata"+suffix).str(),
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
||||
void MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer,
|
||||
MCWin64EHUnwindInfo *info) {
|
||||
// Switch sections (the static function above is meant to be called from
|
||||
// here and from Emit().
|
||||
MCContext &context = streamer.getContext();
|
||||
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
||||
const MCSection *xdataSect =
|
||||
TAI.getWin64EHTableSection(GetSectionSuffix(info->Function));
|
||||
getWin64EHTableSection(GetSectionSuffix(info->Function), context);
|
||||
streamer.SwitchSection(xdataSect);
|
||||
|
||||
llvm::EmitUnwindInfo(streamer, info);
|
||||
@ -236,11 +259,10 @@ void MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer,
|
||||
void MCWin64EHUnwindEmitter::Emit(MCStreamer &streamer) {
|
||||
MCContext &context = streamer.getContext();
|
||||
// Emit the unwind info structs first.
|
||||
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
||||
for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
|
||||
MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
|
||||
const MCSection *xdataSect =
|
||||
TAI.getWin64EHTableSection(GetSectionSuffix(info.Function));
|
||||
getWin64EHTableSection(GetSectionSuffix(info.Function), context);
|
||||
streamer.SwitchSection(xdataSect);
|
||||
llvm::EmitUnwindInfo(streamer, &info);
|
||||
}
|
||||
@ -248,7 +270,7 @@ void MCWin64EHUnwindEmitter::Emit(MCStreamer &streamer) {
|
||||
for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
|
||||
MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
|
||||
const MCSection *pdataSect =
|
||||
TAI.getWin64EHFuncTableSection(GetSectionSuffix(info.Function));
|
||||
getWin64EHFuncTableSection(GetSectionSuffix(info.Function), context);
|
||||
streamer.SwitchSection(pdataSect);
|
||||
EmitRuntimeFunction(streamer, &info);
|
||||
}
|
||||
|
@ -155,4 +155,3 @@ extern "C" void LLVMInitializeARMMCCodeGenInfo() {
|
||||
TargetRegistry::RegisterMCCodeGenInfo(TheARMTarget, createARMMCCodeGenInfo);
|
||||
TargetRegistry::RegisterMCCodeGenInfo(TheThumbTarget, createARMMCCodeGenInfo);
|
||||
}
|
||||
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCInstrInfo.h"
|
||||
#include "llvm/MC/MCObjectFileInfo.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
@ -92,6 +93,7 @@ namespace {
|
||||
const Module *TheModule;
|
||||
const MCAsmInfo* TAsm;
|
||||
const MCRegisterInfo *MRI;
|
||||
const MCObjectFileInfo *MOFI;
|
||||
MCContext *TCtx;
|
||||
const TargetData* TD;
|
||||
|
||||
@ -111,8 +113,8 @@ namespace {
|
||||
static char ID;
|
||||
explicit CWriter(formatted_raw_ostream &o)
|
||||
: FunctionPass(ID), Out(o), IL(0), Mang(0), LI(0),
|
||||
TheModule(0), TAsm(0), MRI(0), TCtx(0), TD(0), OpaqueCounter(0),
|
||||
NextAnonValueNumber(0) {
|
||||
TheModule(0), TAsm(0), MRI(0), MOFI(0), TCtx(0), TD(0),
|
||||
OpaqueCounter(0), NextAnonValueNumber(0) {
|
||||
initializeLoopInfoPass(*PassRegistry::getPassRegistry());
|
||||
FPCounter = 0;
|
||||
}
|
||||
@ -152,6 +154,7 @@ namespace {
|
||||
delete TCtx;
|
||||
delete TAsm;
|
||||
delete MRI;
|
||||
delete MOFI;
|
||||
FPConstantMap.clear();
|
||||
ByValParams.clear();
|
||||
intrinsicPrototypesAlreadyGenerated.clear();
|
||||
@ -1673,7 +1676,7 @@ bool CWriter::doInitialization(Module &M) {
|
||||
#endif
|
||||
TAsm = new CBEMCAsmInfo();
|
||||
MRI = new MCRegisterInfo();
|
||||
TCtx = new MCContext(*TAsm, *MRI, NULL);
|
||||
TCtx = new MCContext(*TAsm, *MRI, NULL, NULL);
|
||||
Mang = new Mangler(*TCtx, *TD);
|
||||
|
||||
// Keep track of which functions are static ctors/dtors so they can have
|
||||
|
@ -35,34 +35,15 @@ using namespace llvm;
|
||||
// Generic Code
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
TargetLoweringObjectFile::TargetLoweringObjectFile() :
|
||||
Ctx(0),
|
||||
TextSection(0),
|
||||
DataSection(0),
|
||||
BSSSection(0),
|
||||
ReadOnlySection(0),
|
||||
StaticCtorSection(0),
|
||||
StaticDtorSection(0),
|
||||
LSDASection(0),
|
||||
CompactUnwindSection(0),
|
||||
DwarfAbbrevSection(0),
|
||||
DwarfInfoSection(0),
|
||||
DwarfLineSection(0),
|
||||
DwarfFrameSection(0),
|
||||
DwarfPubNamesSection(0),
|
||||
DwarfPubTypesSection(0),
|
||||
DwarfDebugInlineSection(0),
|
||||
DwarfStrSection(0),
|
||||
DwarfLocSection(0),
|
||||
DwarfARangesSection(0),
|
||||
DwarfRangesSection(0),
|
||||
DwarfMacroInfoSection(0),
|
||||
TLSExtraDataSection(0),
|
||||
CommDirectiveSupportsAlignment(true),
|
||||
SupportsWeakOmittedEHFrame(true),
|
||||
IsFunctionEHFrameSymbolPrivate(true) {
|
||||
/// 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.
|
||||
void TargetLoweringObjectFile::Initialize(MCContext &ctx,
|
||||
const TargetMachine &TM) {
|
||||
Ctx = &ctx;
|
||||
InitMCObjectFileInfo(TM.getTargetTriple(), TM.getRelocationModel(), *Ctx);
|
||||
}
|
||||
|
||||
|
||||
TargetLoweringObjectFile::~TargetLoweringObjectFile() {
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc < %s -march=ppc32 -mtriple=ppc-apple-darwin | FileCheck %s
|
||||
; RUN: llc < %s -march=ppc32 -mtriple=powerpc-apple-darwin | FileCheck %s
|
||||
|
||||
; ModuleID = '/Volumes/MacOS9/tests/WebKit/JavaScriptCore/profiler/ProfilerServer.mm'
|
||||
|
||||
|
@ -18,6 +18,8 @@
|
||||
#include "llvm/MC/MCCodeEmitter.h"
|
||||
#include "llvm/MC/MCInstPrinter.h"
|
||||
#include "llvm/MC/MCInstrInfo.h"
|
||||
#include "llvm/MC/MCObjectFileInfo.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCSubtargetInfo.h"
|
||||
@ -346,7 +348,12 @@ static int AssembleInput(const char *ProgName) {
|
||||
}
|
||||
|
||||
const TargetAsmInfo *tai = new TargetAsmInfo(*TM);
|
||||
MCContext Ctx(*MAI, *MRI, tai);
|
||||
// FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and
|
||||
// MCObjectFileInfo needs a MCContext reference in order to initialize itself.
|
||||
OwningPtr<MCObjectFileInfo> MOFI(new MCObjectFileInfo());
|
||||
MCContext Ctx(*MAI, *MRI, MOFI.get(), tai);
|
||||
MOFI->InitMCObjectFileInfo(TripleName, RelocModel, Ctx);
|
||||
|
||||
if (SaveTempLabels)
|
||||
Ctx.setAllowTemporaryLabels(false);
|
||||
|
||||
|
@ -314,7 +314,7 @@ void LTOCodeGenerator::applyScopeRestrictions() {
|
||||
|
||||
// mark which symbols can not be internalized
|
||||
MCContext Context(*_target->getMCAsmInfo(), *_target->getRegisterInfo(),
|
||||
NULL);
|
||||
NULL, NULL);
|
||||
Mangler mangler(Context, *_target->getTargetData());
|
||||
std::vector<const char*> mustPreserveList;
|
||||
SmallPtrSet<GlobalValue*, 8> asmUsed;
|
||||
|
@ -665,7 +665,7 @@ static bool isAliasToDeclaration(const GlobalAlias &V) {
|
||||
bool LTOModule::ParseSymbols() {
|
||||
// Use mangler to add GlobalPrefix to names to match linker names.
|
||||
MCContext Context(*_target->getMCAsmInfo(), *_target->getRegisterInfo(),
|
||||
NULL);
|
||||
NULL, NULL);
|
||||
Mangler mangler(Context, *_target->getTargetData());
|
||||
|
||||
// add functions
|
||||
|
Loading…
Reference in New Issue
Block a user