mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-16 12:24:03 +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:
@ -175,6 +175,7 @@ public:
|
|||||||
MachineModuleInfo(); // DUMMY CONSTRUCTOR, DO NOT CALL.
|
MachineModuleInfo(); // DUMMY CONSTRUCTOR, DO NOT CALL.
|
||||||
// Real constructor.
|
// Real constructor.
|
||||||
MachineModuleInfo(const MCAsmInfo &MAI, const MCRegisterInfo &MRI,
|
MachineModuleInfo(const MCAsmInfo &MAI, const MCRegisterInfo &MRI,
|
||||||
|
const MCObjectFileInfo *MOFI,
|
||||||
const TargetAsmInfo *TAI);
|
const TargetAsmInfo *TAI);
|
||||||
~MachineModuleInfo();
|
~MachineModuleInfo();
|
||||||
|
|
||||||
|
@ -33,42 +33,13 @@ namespace llvm {
|
|||||||
|
|
||||||
|
|
||||||
class TargetLoweringObjectFileELF : public TargetLoweringObjectFile {
|
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:
|
public:
|
||||||
TargetLoweringObjectFileELF();
|
virtual ~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 void emitPersonalityValue(MCStreamer &Streamer,
|
virtual void emitPersonalityValue(MCStreamer &Streamer,
|
||||||
const TargetMachine &TM,
|
const TargetMachine &TM,
|
||||||
const MCSymbol *Sym) const;
|
const MCSymbol *Sym) const;
|
||||||
|
|
||||||
const MCSection *getDataRelSection() const { return DataRelSection; }
|
|
||||||
|
|
||||||
/// getSectionForConstant - Given a constant with the SectionKind, return a
|
/// getSectionForConstant - Given a constant with the SectionKind, return a
|
||||||
/// section that it should be placed in.
|
/// section that it should be placed in.
|
||||||
virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
|
virtual const MCSection *getSectionForConstant(SectionKind Kind) const;
|
||||||
@ -99,48 +70,8 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
|
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:
|
public:
|
||||||
TargetLoweringObjectFileMachO();
|
virtual ~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 const MCSection *
|
virtual const MCSection *
|
||||||
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||||
@ -158,30 +89,6 @@ public:
|
|||||||
virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
|
virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
|
||||||
Mangler *) const;
|
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
|
/// getExprForDwarfGlobalReference - The mach-o version of this method
|
||||||
/// defaults to returning a stub reference.
|
/// defaults to returning a stub reference.
|
||||||
virtual const MCExpr *
|
virtual const MCExpr *
|
||||||
@ -203,20 +110,8 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
|
class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
|
||||||
const MCSection *DrectveSection;
|
|
||||||
const MCSection *PDataSection;
|
|
||||||
const MCSection *XDataSection;
|
|
||||||
public:
|
public:
|
||||||
TargetLoweringObjectFileCOFF();
|
virtual ~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 const MCSection *
|
virtual const MCSection *
|
||||||
getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||||
|
@ -26,6 +26,7 @@ namespace llvm {
|
|||||||
class MCLabel;
|
class MCLabel;
|
||||||
class MCDwarfFile;
|
class MCDwarfFile;
|
||||||
class MCDwarfLoc;
|
class MCDwarfLoc;
|
||||||
|
class MCObjectFileInfo;
|
||||||
class MCRegisterInfo;
|
class MCRegisterInfo;
|
||||||
class MCLineSection;
|
class MCLineSection;
|
||||||
class StringRef;
|
class StringRef;
|
||||||
@ -50,6 +51,9 @@ namespace llvm {
|
|||||||
/// The MCRegisterInfo for this target.
|
/// The MCRegisterInfo for this target.
|
||||||
const MCRegisterInfo &MRI;
|
const MCRegisterInfo &MRI;
|
||||||
|
|
||||||
|
/// The MCObjectFileInfo for this target.
|
||||||
|
const MCObjectFileInfo *MOFI;
|
||||||
|
|
||||||
const TargetAsmInfo *TAI;
|
const TargetAsmInfo *TAI;
|
||||||
|
|
||||||
/// Allocator - Allocator object used for creating machine code objects.
|
/// Allocator - Allocator object used for creating machine code objects.
|
||||||
@ -115,13 +119,15 @@ namespace llvm {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MCContext(const MCAsmInfo &MAI, const MCRegisterInfo &MRI,
|
explicit MCContext(const MCAsmInfo &MAI, const MCRegisterInfo &MRI,
|
||||||
const TargetAsmInfo *TAI);
|
const MCObjectFileInfo *MOFI, const TargetAsmInfo *TAI);
|
||||||
~MCContext();
|
~MCContext();
|
||||||
|
|
||||||
const MCAsmInfo &getAsmInfo() const { return MAI; }
|
const MCAsmInfo &getAsmInfo() const { return MAI; }
|
||||||
|
|
||||||
const MCRegisterInfo &getRegisterInfo() const { return MRI; }
|
const MCRegisterInfo &getRegisterInfo() const { return MRI; }
|
||||||
|
|
||||||
|
const MCObjectFileInfo *getObjectFileInfo() const { return MOFI; }
|
||||||
|
|
||||||
const TargetAsmInfo &getTargetAsmInfo() const { return *TAI; }
|
const TargetAsmInfo &getTargetAsmInfo() const { return *TAI; }
|
||||||
|
|
||||||
void setAllowTemporaryLabels(bool Value) { AllowTemporaryLabels = Value; }
|
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
|
#define LLVM_TARGET_TARGETASMINFO_H
|
||||||
|
|
||||||
#include "llvm/Target/TargetLoweringObjectFile.h"
|
#include "llvm/Target/TargetLoweringObjectFile.h"
|
||||||
#include "llvm/Target/TargetRegisterInfo.h"
|
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
template <typename T> class ArrayRef;
|
|
||||||
class MCSection;
|
|
||||||
class TargetMachine;
|
class TargetMachine;
|
||||||
class TargetLoweringObjectFile;
|
class TargetLoweringObjectFile;
|
||||||
|
|
||||||
@ -29,37 +26,9 @@ class TargetAsmInfo {
|
|||||||
public:
|
public:
|
||||||
explicit TargetAsmInfo(const TargetMachine &TM);
|
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 {
|
unsigned getFDEEncoding(bool CFI) const {
|
||||||
return TLOF->getFDEEncoding(CFI);
|
return TLOF->getFDEEncoding(CFI);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isFunctionEHFrameSymbolPrivate() const {
|
|
||||||
return TLOF->isFunctionEHFrameSymbolPrivate();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
|
#define LLVM_TARGET_TARGETLOWERINGOBJECTFILE_H
|
||||||
|
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
|
#include "llvm/MC/MCObjectFileInfo.h"
|
||||||
#include "llvm/MC/SectionKind.h"
|
#include "llvm/MC/SectionKind.h"
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
@ -31,137 +32,27 @@ namespace llvm {
|
|||||||
class GlobalValue;
|
class GlobalValue;
|
||||||
class TargetMachine;
|
class TargetMachine;
|
||||||
|
|
||||||
class TargetLoweringObjectFile {
|
class TargetLoweringObjectFile : public MCObjectFileInfo {
|
||||||
MCContext *Ctx;
|
MCContext *Ctx;
|
||||||
|
|
||||||
TargetLoweringObjectFile(const TargetLoweringObjectFile&); // DO NOT IMPLEMENT
|
TargetLoweringObjectFile(const TargetLoweringObjectFile&); // DO NOT IMPLEMENT
|
||||||
void operator=(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:
|
public:
|
||||||
MCContext &getContext() const { return *Ctx; }
|
MCContext &getContext() const { return *Ctx; }
|
||||||
|
|
||||||
|
TargetLoweringObjectFile() : MCObjectFileInfo(), Ctx(0) {}
|
||||||
|
|
||||||
virtual ~TargetLoweringObjectFile();
|
virtual ~TargetLoweringObjectFile();
|
||||||
|
|
||||||
/// Initialize - this method must be called before any actual lowering is
|
/// Initialize - this method must be called before any actual lowering is
|
||||||
/// done. This specifies the current context for codegen, and gives the
|
/// done. This specifies the current context for codegen, and gives the
|
||||||
/// lowering implementations a chance to set up their default sections.
|
/// lowering implementations a chance to set up their default sections.
|
||||||
virtual void Initialize(MCContext &ctx, const TargetMachine &TM) {
|
virtual void Initialize(MCContext &ctx, const TargetMachine &TM);
|
||||||
Ctx = &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;}
|
|
||||||
virtual const MCSection *getEHFrameSection() const = 0;
|
|
||||||
virtual void emitPersonalityValue(MCStreamer &Streamer,
|
virtual void emitPersonalityValue(MCStreamer &Streamer,
|
||||||
const TargetMachine &TM,
|
const TargetMachine &TM,
|
||||||
const MCSymbol *Sym) const;
|
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
|
/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
|
||||||
/// decide not to emit the UsedDirective for some symbols in llvm.used.
|
/// decide not to emit the UsedDirective for some symbols in llvm.used.
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
#include "llvm/Target/Mangler.h"
|
#include "llvm/Target/Mangler.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
#include "llvm/Target/TargetFrameLowering.h"
|
#include "llvm/Target/TargetFrameLowering.h"
|
||||||
#include "llvm/Target/TargetLoweringObjectFile.h"
|
|
||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/Target/TargetMachine.h"
|
||||||
#include "llvm/Target/TargetOptions.h"
|
#include "llvm/Target/TargetOptions.h"
|
||||||
#include "llvm/Target/TargetRegisterInfo.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
|
// This is a temporary hack to keep sections in the same order they
|
||||||
// were before. This lets us produce bit identical outputs while
|
// were before. This lets us produce bit identical outputs while
|
||||||
// transitioning to CFI.
|
// 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)
|
ELFWriter::ELFWriter(raw_ostream &o, TargetMachine &tm)
|
||||||
: MachineFunctionPass(ID), O(o), TM(tm),
|
: MachineFunctionPass(ID), O(o), TM(tm),
|
||||||
OutContext(*new MCContext(*TM.getMCAsmInfo(), *TM.getRegisterInfo(),
|
OutContext(*new MCContext(*TM.getMCAsmInfo(), *TM.getRegisterInfo(),
|
||||||
|
&TM.getTargetLowering()->getObjFileLowering(),
|
||||||
new TargetAsmInfo(tm))),
|
new TargetAsmInfo(tm))),
|
||||||
TLOF(TM.getTargetLowering()->getObjFileLowering()),
|
TLOF(TM.getTargetLowering()->getObjFileLowering()),
|
||||||
is64Bit(TM.getTargetData()->getPointerSizeInBits() == 64),
|
is64Bit(TM.getTargetData()->getPointerSizeInBits() == 64),
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "llvm/Target/TargetAsmInfo.h"
|
#include "llvm/Target/TargetAsmInfo.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
#include "llvm/Target/TargetInstrInfo.h"
|
#include "llvm/Target/TargetInstrInfo.h"
|
||||||
|
#include "llvm/Target/TargetRegisterInfo.h"
|
||||||
#include "llvm/Target/TargetRegistry.h"
|
#include "llvm/Target/TargetRegistry.h"
|
||||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||||
#include "llvm/Transforms/Scalar.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.
|
// all the per-module stuff we're generating, including MCContext.
|
||||||
TargetAsmInfo *TAI = new TargetAsmInfo(*this);
|
TargetAsmInfo *TAI = new TargetAsmInfo(*this);
|
||||||
MachineModuleInfo *MMI = new MachineModuleInfo(*getMCAsmInfo(),
|
MachineModuleInfo *MMI = new MachineModuleInfo(*getMCAsmInfo(),
|
||||||
*getRegisterInfo(), TAI);
|
*getRegisterInfo(),
|
||||||
|
&getTargetLowering()->getObjFileLowering(),
|
||||||
|
TAI);
|
||||||
PM.add(MMI);
|
PM.add(MMI);
|
||||||
OutContext = &MMI->getContext(); // Return the MCContext specifically by-ref.
|
OutContext = &MMI->getContext(); // Return the MCContext specifically by-ref.
|
||||||
|
|
||||||
|
@ -17,9 +17,8 @@
|
|||||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||||
#include "llvm/CodeGen/MachineFunction.h"
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
#include "llvm/CodeGen/Passes.h"
|
#include "llvm/CodeGen/Passes.h"
|
||||||
#include "llvm/Target/TargetInstrInfo.h"
|
#include "llvm/Target/TargetAsmInfo.h"
|
||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/MC/MCObjectFileInfo.h"
|
||||||
#include "llvm/Target/TargetOptions.h"
|
|
||||||
#include "llvm/MC/MCSymbol.h"
|
#include "llvm/MC/MCSymbol.h"
|
||||||
#include "llvm/ADT/PointerUnion.h"
|
#include "llvm/ADT/PointerUnion.h"
|
||||||
#include "llvm/Support/Dwarf.h"
|
#include "llvm/Support/Dwarf.h"
|
||||||
@ -255,8 +254,9 @@ void MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {
|
|||||||
|
|
||||||
MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI,
|
MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI,
|
||||||
const MCRegisterInfo &MRI,
|
const MCRegisterInfo &MRI,
|
||||||
|
const MCObjectFileInfo *MOFI,
|
||||||
const TargetAsmInfo *TAI)
|
const TargetAsmInfo *TAI)
|
||||||
: ImmutablePass(ID), Context(MAI, MRI, TAI),
|
: ImmutablePass(ID), Context(MAI, MRI, MOFI, TAI),
|
||||||
ObjFileMMI(0), CompactUnwindEncoding(0), CurCallSite(0), CallsEHReturn(0),
|
ObjFileMMI(0), CompactUnwindEncoding(0), CurCallSite(0), CallsEHReturn(0),
|
||||||
CallsUnwindInit(0), DbgInfoAvailable(false),
|
CallsUnwindInit(0), DbgInfoAvailable(false),
|
||||||
CallsExternalVAFunctionWithFloatingPointArguments(false) {
|
CallsExternalVAFunctionWithFloatingPointArguments(false) {
|
||||||
@ -268,7 +268,8 @@ MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI,
|
|||||||
}
|
}
|
||||||
|
|
||||||
MachineModuleInfo::MachineModuleInfo()
|
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 "
|
assert(0 && "This MachineModuleInfo constructor should never be called, MMI "
|
||||||
"should always be explicitly constructed by LLVMTargetMachine");
|
"should always be explicitly constructed by LLVMTargetMachine");
|
||||||
abort();
|
abort();
|
||||||
|
@ -43,153 +43,6 @@ using namespace dwarf;
|
|||||||
// ELF
|
// 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 *
|
MCSymbol *
|
||||||
TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
|
TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
|
||||||
Mangler *Mang,
|
Mangler *Mang,
|
||||||
@ -493,221 +346,6 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
|||||||
// MachO
|
// 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::
|
const MCSection *TargetLoweringObjectFileMachO::
|
||||||
getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
|
||||||
Mangler *Mang, const TargetMachine &TM) const {
|
Mangler *Mang, const TargetMachine &TM) const {
|
||||||
@ -925,163 +563,6 @@ unsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
|
|||||||
// COFF
|
// 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
|
static unsigned
|
||||||
getCOFFSectionFlags(SectionKind K) {
|
getCOFFSectionFlags(SectionKind K) {
|
||||||
unsigned Flags = 0;
|
unsigned Flags = 0;
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "llvm/MC/MCInst.h"
|
#include "llvm/MC/MCInst.h"
|
||||||
#include "llvm/MC/MCInstPrinter.h"
|
#include "llvm/MC/MCInstPrinter.h"
|
||||||
#include "llvm/MC/MCRegisterInfo.h"
|
#include "llvm/MC/MCRegisterInfo.h"
|
||||||
|
#include "llvm/MC/MCSectionCOFF.h"
|
||||||
#include "llvm/MC/MCSectionMachO.h"
|
#include "llvm/MC/MCSectionMachO.h"
|
||||||
#include "llvm/MC/MCSymbol.h"
|
#include "llvm/MC/MCSymbol.h"
|
||||||
#include "llvm/ADT/OwningPtr.h"
|
#include "llvm/ADT/OwningPtr.h"
|
||||||
@ -995,6 +996,19 @@ void MCAsmStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind,
|
|||||||
EmitEOL();
|
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() {
|
void MCAsmStreamer::EmitWin64EHHandlerData() {
|
||||||
MCStreamer::EmitWin64EHHandlerData();
|
MCStreamer::EmitWin64EHHandlerData();
|
||||||
|
|
||||||
@ -1004,8 +1018,7 @@ void MCAsmStreamer::EmitWin64EHHandlerData() {
|
|||||||
// data block is visible.
|
// data block is visible.
|
||||||
MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo();
|
MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo();
|
||||||
StringRef suffix=MCWin64EHUnwindEmitter::GetSectionSuffix(CurFrame->Function);
|
StringRef suffix=MCWin64EHUnwindEmitter::GetSectionSuffix(CurFrame->Function);
|
||||||
const MCSection *xdataSect =
|
const MCSection *xdataSect = getWin64EHTableSection(suffix, getContext());
|
||||||
getContext().getTargetAsmInfo().getWin64EHTableSection(suffix);
|
|
||||||
if (xdataSect)
|
if (xdataSect)
|
||||||
SwitchSectionNoChange(xdataSect);
|
SwitchSectionNoChange(xdataSect);
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "llvm/MC/MCContext.h"
|
#include "llvm/MC/MCContext.h"
|
||||||
#include "llvm/MC/MCAsmInfo.h"
|
#include "llvm/MC/MCAsmInfo.h"
|
||||||
|
#include "llvm/MC/MCObjectFileInfo.h"
|
||||||
#include "llvm/MC/MCRegisterInfo.h"
|
#include "llvm/MC/MCRegisterInfo.h"
|
||||||
#include "llvm/MC/MCSectionMachO.h"
|
#include "llvm/MC/MCSectionMachO.h"
|
||||||
#include "llvm/MC/MCSectionELF.h"
|
#include "llvm/MC/MCSectionELF.h"
|
||||||
@ -28,8 +29,8 @@ typedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
|
|||||||
|
|
||||||
|
|
||||||
MCContext::MCContext(const MCAsmInfo &mai, const MCRegisterInfo &mri,
|
MCContext::MCContext(const MCAsmInfo &mai, const MCRegisterInfo &mri,
|
||||||
const TargetAsmInfo *tai) :
|
const MCObjectFileInfo *mofi, const TargetAsmInfo *tai) :
|
||||||
MAI(mai), MRI(mri), TAI(tai),
|
MAI(mai), MRI(mri), MOFI(mofi), TAI(tai),
|
||||||
Allocator(), Symbols(Allocator), UsedNames(Allocator),
|
Allocator(), Symbols(Allocator), UsedNames(Allocator),
|
||||||
NextUniqueID(0),
|
NextUniqueID(0),
|
||||||
CurrentDwarfLoc(0,0,0,DWARF2_FLAG_IS_STMT,0,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!");
|
assert(tai && "Unable to create target assembler!");
|
||||||
|
|
||||||
// Set up the MCContext for creating symbols and MCExpr's.
|
// 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!");
|
assert(Ctx && "Unable to create MCContext!");
|
||||||
|
|
||||||
// Set up disassembler.
|
// Set up disassembler.
|
||||||
|
@ -377,7 +377,7 @@ int EDDisassembler::parseInst(SmallVectorImpl<MCParsedAsmOperand*> &operands,
|
|||||||
SourceMgr sourceMgr;
|
SourceMgr sourceMgr;
|
||||||
sourceMgr.setDiagHandler(diag_handler, static_cast<void*>(this));
|
sourceMgr.setDiagHandler(diag_handler, static_cast<void*>(this));
|
||||||
sourceMgr.AddNewSourceBuffer(buf, SMLoc()); // ownership of buf handed over
|
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<MCStreamer> streamer(createNullStreamer(context));
|
||||||
OwningPtr<MCAsmParser> genericParser(createMCAsmParser(*Tgt, sourceMgr,
|
OwningPtr<MCAsmParser> genericParser(createMCAsmParser(*Tgt, sourceMgr,
|
||||||
context, *streamer,
|
context, *streamer,
|
||||||
|
@ -7,13 +7,15 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "llvm/MC/MCAsmInfo.h"
|
|
||||||
#include "llvm/MC/MCDwarf.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/MCStreamer.h"
|
||||||
#include "llvm/MC/MCSymbol.h"
|
#include "llvm/MC/MCSymbol.h"
|
||||||
#include "llvm/MC/MCExpr.h"
|
#include "llvm/MC/MCExpr.h"
|
||||||
#include "llvm/MC/MCContext.h"
|
|
||||||
#include "llvm/MC/MCObjectWriter.h"
|
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
@ -196,7 +198,7 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
|
|||||||
MCOS->EmitLabel(SectionEnd);
|
MCOS->EmitLabel(SectionEnd);
|
||||||
|
|
||||||
// Switch back the the dwarf line section.
|
// Switch back the the dwarf line section.
|
||||||
MCOS->SwitchSection(context.getTargetAsmInfo().getDwarfLineSection());
|
MCOS->SwitchSection(context.getObjectFileInfo()->getDwarfLineSection());
|
||||||
|
|
||||||
const MCAsmInfo &asmInfo = MCOS->getContext().getAsmInfo();
|
const MCAsmInfo &asmInfo = MCOS->getContext().getAsmInfo();
|
||||||
MCOS->EmitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd,
|
MCOS->EmitDwarfAdvanceLineAddr(INT64_MAX, LastLabel, SectionEnd,
|
||||||
@ -209,7 +211,7 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
|
|||||||
void MCDwarfFileTable::Emit(MCStreamer *MCOS) {
|
void MCDwarfFileTable::Emit(MCStreamer *MCOS) {
|
||||||
MCContext &context = MCOS->getContext();
|
MCContext &context = MCOS->getContext();
|
||||||
// Switch to the section where the table will be emitted into.
|
// 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.
|
// Create a symbol at the beginning of this section.
|
||||||
MCSymbol *LineStartSym = context.CreateTempSymbol();
|
MCSymbol *LineStartSym = context.CreateTempSymbol();
|
||||||
@ -688,6 +690,7 @@ void FrameEmitterImpl::EmitCFIInstructions(MCStreamer &streamer,
|
|||||||
bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
|
bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
|
||||||
const MCDwarfFrameInfo &Frame) {
|
const MCDwarfFrameInfo &Frame) {
|
||||||
MCContext &Context = Streamer.getContext();
|
MCContext &Context = Streamer.getContext();
|
||||||
|
const MCObjectFileInfo *MOFI = Context.getObjectFileInfo();
|
||||||
const TargetAsmInfo &TAI = Context.getTargetAsmInfo();
|
const TargetAsmInfo &TAI = Context.getTargetAsmInfo();
|
||||||
bool VerboseAsm = Streamer.isVerboseAsm();
|
bool VerboseAsm = Streamer.isVerboseAsm();
|
||||||
|
|
||||||
@ -720,7 +723,7 @@ bool FrameEmitterImpl::EmitCompactUnwind(MCStreamer &Streamer,
|
|||||||
if (Frame.Lsda)
|
if (Frame.Lsda)
|
||||||
Encoding |= 0x40000000;
|
Encoding |= 0x40000000;
|
||||||
|
|
||||||
Streamer.SwitchSection(TAI.getCompactUnwindSection());
|
Streamer.SwitchSection(MOFI->getCompactUnwindSection());
|
||||||
|
|
||||||
// Range Start
|
// Range Start
|
||||||
unsigned FDEEncoding = TAI.getFDEEncoding(UsingCFI);
|
unsigned FDEEncoding = TAI.getFDEEncoding(UsingCFI);
|
||||||
@ -767,11 +770,12 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,
|
|||||||
unsigned lsdaEncoding) {
|
unsigned lsdaEncoding) {
|
||||||
MCContext &context = streamer.getContext();
|
MCContext &context = streamer.getContext();
|
||||||
const MCRegisterInfo &MRI = context.getRegisterInfo();
|
const MCRegisterInfo &MRI = context.getRegisterInfo();
|
||||||
|
const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
|
||||||
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
||||||
bool verboseAsm = streamer.isVerboseAsm();
|
bool verboseAsm = streamer.isVerboseAsm();
|
||||||
|
|
||||||
MCSymbol *sectionStart;
|
MCSymbol *sectionStart;
|
||||||
if (TAI.isFunctionEHFrameSymbolPrivate() || !IsEH)
|
if (MOFI->isFunctionEHFrameSymbolPrivate() || !IsEH)
|
||||||
sectionStart = context.CreateTempSymbol();
|
sectionStart = context.CreateTempSymbol();
|
||||||
else
|
else
|
||||||
sectionStart = context.GetOrCreateSymbol(Twine("EH_frame") + Twine(CIENum));
|
sectionStart = context.GetOrCreateSymbol(Twine("EH_frame") + Twine(CIENum));
|
||||||
@ -890,10 +894,11 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
|
|||||||
MCContext &context = streamer.getContext();
|
MCContext &context = streamer.getContext();
|
||||||
MCSymbol *fdeStart = context.CreateTempSymbol();
|
MCSymbol *fdeStart = context.CreateTempSymbol();
|
||||||
MCSymbol *fdeEnd = context.CreateTempSymbol();
|
MCSymbol *fdeEnd = context.CreateTempSymbol();
|
||||||
|
const MCObjectFileInfo *MOFI = context.getObjectFileInfo();
|
||||||
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
||||||
bool verboseAsm = streamer.isVerboseAsm();
|
bool verboseAsm = streamer.isVerboseAsm();
|
||||||
|
|
||||||
if (!TAI.isFunctionEHFrameSymbolPrivate() && IsEH) {
|
if (!MOFI->isFunctionEHFrameSymbolPrivate() && IsEH) {
|
||||||
MCSymbol *EHSym =
|
MCSymbol *EHSym =
|
||||||
context.GetOrCreateSymbol(frame.Function->getName() + Twine(".eh"));
|
context.GetOrCreateSymbol(frame.Function->getName() + Twine(".eh"));
|
||||||
streamer.EmitEHSymAttributes(frame.Function, EHSym);
|
streamer.EmitEHSymAttributes(frame.Function, EHSym);
|
||||||
@ -1008,9 +1013,10 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer,
|
|||||||
bool UsingCFI,
|
bool UsingCFI,
|
||||||
bool IsEH) {
|
bool IsEH) {
|
||||||
MCContext &Context = Streamer.getContext();
|
MCContext &Context = Streamer.getContext();
|
||||||
const TargetAsmInfo &TAI = Context.getTargetAsmInfo();
|
MCObjectFileInfo *MOFI =
|
||||||
const MCSection &Section = IsEH ? *TAI.getEHFrameSection() :
|
const_cast<MCObjectFileInfo*>(Context.getObjectFileInfo());
|
||||||
*TAI.getDwarfFrameSection();
|
const MCSection &Section = IsEH ? *MOFI->getEHFrameSection() :
|
||||||
|
*MOFI->getDwarfFrameSection();
|
||||||
Streamer.SwitchSection(&Section);
|
Streamer.SwitchSection(&Section);
|
||||||
MCSymbol *SectionStart = Context.CreateTempSymbol();
|
MCSymbol *SectionStart = Context.CreateTempSymbol();
|
||||||
Streamer.EmitLabel(SectionStart);
|
Streamer.EmitLabel(SectionStart);
|
||||||
@ -1022,7 +1028,8 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer,
|
|||||||
const MCSymbol *DummyDebugKey = NULL;
|
const MCSymbol *DummyDebugKey = NULL;
|
||||||
for (unsigned i = 0, n = Streamer.getNumFrameInfos(); i < n; ++i) {
|
for (unsigned i = 0, n = Streamer.getNumFrameInfos(); i < n; ++i) {
|
||||||
const MCDwarfFrameInfo &Frame = Streamer.getFrameInfo(i);
|
const MCDwarfFrameInfo &Frame = Streamer.getFrameInfo(i);
|
||||||
if (IsEH && TAI.getCompactUnwindSection() && Frame.CompactUnwindEncoding &&
|
if (IsEH && MOFI->getCompactUnwindSection() &&
|
||||||
|
Frame.CompactUnwindEncoding &&
|
||||||
Emitter.EmitCompactUnwind(Streamer, Frame)) {
|
Emitter.EmitCompactUnwind(Streamer, Frame)) {
|
||||||
FDEEnd = NULL;
|
FDEEnd = NULL;
|
||||||
continue;
|
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/AsmLexer.h"
|
||||||
#include "llvm/MC/MCParser/MCAsmParser.h"
|
#include "llvm/MC/MCParser/MCAsmParser.h"
|
||||||
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
|
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
|
||||||
|
#include "llvm/MC/MCRegisterInfo.h"
|
||||||
#include "llvm/MC/MCSectionMachO.h"
|
#include "llvm/MC/MCSectionMachO.h"
|
||||||
#include "llvm/MC/MCStreamer.h"
|
#include "llvm/MC/MCStreamer.h"
|
||||||
#include "llvm/MC/MCSymbol.h"
|
#include "llvm/MC/MCSymbol.h"
|
||||||
|
@ -10,10 +10,11 @@
|
|||||||
#include "llvm/MC/MCWin64EH.h"
|
#include "llvm/MC/MCWin64EH.h"
|
||||||
#include "llvm/MC/MCStreamer.h"
|
#include "llvm/MC/MCStreamer.h"
|
||||||
#include "llvm/MC/MCContext.h"
|
#include "llvm/MC/MCContext.h"
|
||||||
|
#include "llvm/MC/MCObjectFileInfo.h"
|
||||||
#include "llvm/MC/MCSymbol.h"
|
#include "llvm/MC/MCSymbol.h"
|
||||||
#include "llvm/MC/MCSectionCOFF.h"
|
#include "llvm/MC/MCSectionCOFF.h"
|
||||||
#include "llvm/MC/MCExpr.h"
|
#include "llvm/MC/MCExpr.h"
|
||||||
#include "llvm/Target/TargetAsmInfo.h"
|
#include "llvm/ADT/Twine.h"
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
@ -220,14 +221,36 @@ StringRef MCWin64EHUnwindEmitter::GetSectionSuffix(const MCSymbol *func) {
|
|||||||
return "";
|
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,
|
void MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer,
|
||||||
MCWin64EHUnwindInfo *info) {
|
MCWin64EHUnwindInfo *info) {
|
||||||
// Switch sections (the static function above is meant to be called from
|
// Switch sections (the static function above is meant to be called from
|
||||||
// here and from Emit().
|
// here and from Emit().
|
||||||
MCContext &context = streamer.getContext();
|
MCContext &context = streamer.getContext();
|
||||||
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
|
||||||
const MCSection *xdataSect =
|
const MCSection *xdataSect =
|
||||||
TAI.getWin64EHTableSection(GetSectionSuffix(info->Function));
|
getWin64EHTableSection(GetSectionSuffix(info->Function), context);
|
||||||
streamer.SwitchSection(xdataSect);
|
streamer.SwitchSection(xdataSect);
|
||||||
|
|
||||||
llvm::EmitUnwindInfo(streamer, info);
|
llvm::EmitUnwindInfo(streamer, info);
|
||||||
@ -236,11 +259,10 @@ void MCWin64EHUnwindEmitter::EmitUnwindInfo(MCStreamer &streamer,
|
|||||||
void MCWin64EHUnwindEmitter::Emit(MCStreamer &streamer) {
|
void MCWin64EHUnwindEmitter::Emit(MCStreamer &streamer) {
|
||||||
MCContext &context = streamer.getContext();
|
MCContext &context = streamer.getContext();
|
||||||
// Emit the unwind info structs first.
|
// Emit the unwind info structs first.
|
||||||
const TargetAsmInfo &TAI = context.getTargetAsmInfo();
|
|
||||||
for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
|
for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
|
||||||
MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
|
MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
|
||||||
const MCSection *xdataSect =
|
const MCSection *xdataSect =
|
||||||
TAI.getWin64EHTableSection(GetSectionSuffix(info.Function));
|
getWin64EHTableSection(GetSectionSuffix(info.Function), context);
|
||||||
streamer.SwitchSection(xdataSect);
|
streamer.SwitchSection(xdataSect);
|
||||||
llvm::EmitUnwindInfo(streamer, &info);
|
llvm::EmitUnwindInfo(streamer, &info);
|
||||||
}
|
}
|
||||||
@ -248,7 +270,7 @@ void MCWin64EHUnwindEmitter::Emit(MCStreamer &streamer) {
|
|||||||
for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
|
for (unsigned i = 0; i < streamer.getNumW64UnwindInfos(); ++i) {
|
||||||
MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
|
MCWin64EHUnwindInfo &info = streamer.getW64UnwindInfo(i);
|
||||||
const MCSection *pdataSect =
|
const MCSection *pdataSect =
|
||||||
TAI.getWin64EHFuncTableSection(GetSectionSuffix(info.Function));
|
getWin64EHFuncTableSection(GetSectionSuffix(info.Function), context);
|
||||||
streamer.SwitchSection(pdataSect);
|
streamer.SwitchSection(pdataSect);
|
||||||
EmitRuntimeFunction(streamer, &info);
|
EmitRuntimeFunction(streamer, &info);
|
||||||
}
|
}
|
||||||
|
@ -155,4 +155,3 @@ extern "C" void LLVMInitializeARMMCCodeGenInfo() {
|
|||||||
TargetRegistry::RegisterMCCodeGenInfo(TheARMTarget, createARMMCCodeGenInfo);
|
TargetRegistry::RegisterMCCodeGenInfo(TheARMTarget, createARMMCCodeGenInfo);
|
||||||
TargetRegistry::RegisterMCCodeGenInfo(TheThumbTarget, createARMMCCodeGenInfo);
|
TargetRegistry::RegisterMCCodeGenInfo(TheThumbTarget, createARMMCCodeGenInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include "llvm/MC/MCAsmInfo.h"
|
#include "llvm/MC/MCAsmInfo.h"
|
||||||
#include "llvm/MC/MCContext.h"
|
#include "llvm/MC/MCContext.h"
|
||||||
#include "llvm/MC/MCInstrInfo.h"
|
#include "llvm/MC/MCInstrInfo.h"
|
||||||
|
#include "llvm/MC/MCObjectFileInfo.h"
|
||||||
#include "llvm/MC/MCRegisterInfo.h"
|
#include "llvm/MC/MCRegisterInfo.h"
|
||||||
#include "llvm/MC/MCSubtargetInfo.h"
|
#include "llvm/MC/MCSubtargetInfo.h"
|
||||||
#include "llvm/MC/MCSymbol.h"
|
#include "llvm/MC/MCSymbol.h"
|
||||||
@ -92,6 +93,7 @@ namespace {
|
|||||||
const Module *TheModule;
|
const Module *TheModule;
|
||||||
const MCAsmInfo* TAsm;
|
const MCAsmInfo* TAsm;
|
||||||
const MCRegisterInfo *MRI;
|
const MCRegisterInfo *MRI;
|
||||||
|
const MCObjectFileInfo *MOFI;
|
||||||
MCContext *TCtx;
|
MCContext *TCtx;
|
||||||
const TargetData* TD;
|
const TargetData* TD;
|
||||||
|
|
||||||
@ -111,8 +113,8 @@ namespace {
|
|||||||
static char ID;
|
static char ID;
|
||||||
explicit CWriter(formatted_raw_ostream &o)
|
explicit CWriter(formatted_raw_ostream &o)
|
||||||
: FunctionPass(ID), Out(o), IL(0), Mang(0), LI(0),
|
: FunctionPass(ID), Out(o), IL(0), Mang(0), LI(0),
|
||||||
TheModule(0), TAsm(0), MRI(0), TCtx(0), TD(0), OpaqueCounter(0),
|
TheModule(0), TAsm(0), MRI(0), MOFI(0), TCtx(0), TD(0),
|
||||||
NextAnonValueNumber(0) {
|
OpaqueCounter(0), NextAnonValueNumber(0) {
|
||||||
initializeLoopInfoPass(*PassRegistry::getPassRegistry());
|
initializeLoopInfoPass(*PassRegistry::getPassRegistry());
|
||||||
FPCounter = 0;
|
FPCounter = 0;
|
||||||
}
|
}
|
||||||
@ -152,6 +154,7 @@ namespace {
|
|||||||
delete TCtx;
|
delete TCtx;
|
||||||
delete TAsm;
|
delete TAsm;
|
||||||
delete MRI;
|
delete MRI;
|
||||||
|
delete MOFI;
|
||||||
FPConstantMap.clear();
|
FPConstantMap.clear();
|
||||||
ByValParams.clear();
|
ByValParams.clear();
|
||||||
intrinsicPrototypesAlreadyGenerated.clear();
|
intrinsicPrototypesAlreadyGenerated.clear();
|
||||||
@ -1673,7 +1676,7 @@ bool CWriter::doInitialization(Module &M) {
|
|||||||
#endif
|
#endif
|
||||||
TAsm = new CBEMCAsmInfo();
|
TAsm = new CBEMCAsmInfo();
|
||||||
MRI = new MCRegisterInfo();
|
MRI = new MCRegisterInfo();
|
||||||
TCtx = new MCContext(*TAsm, *MRI, NULL);
|
TCtx = new MCContext(*TAsm, *MRI, NULL, NULL);
|
||||||
Mang = new Mangler(*TCtx, *TD);
|
Mang = new Mangler(*TCtx, *TD);
|
||||||
|
|
||||||
// Keep track of which functions are static ctors/dtors so they can have
|
// Keep track of which functions are static ctors/dtors so they can have
|
||||||
|
@ -35,32 +35,13 @@ using namespace llvm;
|
|||||||
// Generic Code
|
// Generic Code
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
TargetLoweringObjectFile::TargetLoweringObjectFile() :
|
/// Initialize - this method must be called before any actual lowering is
|
||||||
Ctx(0),
|
/// done. This specifies the current context for codegen, and gives the
|
||||||
TextSection(0),
|
/// lowering implementations a chance to set up their default sections.
|
||||||
DataSection(0),
|
void TargetLoweringObjectFile::Initialize(MCContext &ctx,
|
||||||
BSSSection(0),
|
const TargetMachine &TM) {
|
||||||
ReadOnlySection(0),
|
Ctx = &ctx;
|
||||||
StaticCtorSection(0),
|
InitMCObjectFileInfo(TM.getTargetTriple(), TM.getRelocationModel(), *Ctx);
|
||||||
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) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TargetLoweringObjectFile::~TargetLoweringObjectFile() {
|
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'
|
; ModuleID = '/Volumes/MacOS9/tests/WebKit/JavaScriptCore/profiler/ProfilerServer.mm'
|
||||||
|
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
#include "llvm/MC/MCCodeEmitter.h"
|
#include "llvm/MC/MCCodeEmitter.h"
|
||||||
#include "llvm/MC/MCInstPrinter.h"
|
#include "llvm/MC/MCInstPrinter.h"
|
||||||
#include "llvm/MC/MCInstrInfo.h"
|
#include "llvm/MC/MCInstrInfo.h"
|
||||||
|
#include "llvm/MC/MCObjectFileInfo.h"
|
||||||
|
#include "llvm/MC/MCRegisterInfo.h"
|
||||||
#include "llvm/MC/MCSectionMachO.h"
|
#include "llvm/MC/MCSectionMachO.h"
|
||||||
#include "llvm/MC/MCStreamer.h"
|
#include "llvm/MC/MCStreamer.h"
|
||||||
#include "llvm/MC/MCSubtargetInfo.h"
|
#include "llvm/MC/MCSubtargetInfo.h"
|
||||||
@ -346,7 +348,12 @@ static int AssembleInput(const char *ProgName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const TargetAsmInfo *tai = new TargetAsmInfo(*TM);
|
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)
|
if (SaveTempLabels)
|
||||||
Ctx.setAllowTemporaryLabels(false);
|
Ctx.setAllowTemporaryLabels(false);
|
||||||
|
|
||||||
|
@ -314,7 +314,7 @@ void LTOCodeGenerator::applyScopeRestrictions() {
|
|||||||
|
|
||||||
// mark which symbols can not be internalized
|
// mark which symbols can not be internalized
|
||||||
MCContext Context(*_target->getMCAsmInfo(), *_target->getRegisterInfo(),
|
MCContext Context(*_target->getMCAsmInfo(), *_target->getRegisterInfo(),
|
||||||
NULL);
|
NULL, NULL);
|
||||||
Mangler mangler(Context, *_target->getTargetData());
|
Mangler mangler(Context, *_target->getTargetData());
|
||||||
std::vector<const char*> mustPreserveList;
|
std::vector<const char*> mustPreserveList;
|
||||||
SmallPtrSet<GlobalValue*, 8> asmUsed;
|
SmallPtrSet<GlobalValue*, 8> asmUsed;
|
||||||
|
@ -665,7 +665,7 @@ static bool isAliasToDeclaration(const GlobalAlias &V) {
|
|||||||
bool LTOModule::ParseSymbols() {
|
bool LTOModule::ParseSymbols() {
|
||||||
// Use mangler to add GlobalPrefix to names to match linker names.
|
// Use mangler to add GlobalPrefix to names to match linker names.
|
||||||
MCContext Context(*_target->getMCAsmInfo(), *_target->getRegisterInfo(),
|
MCContext Context(*_target->getMCAsmInfo(), *_target->getRegisterInfo(),
|
||||||
NULL);
|
NULL, NULL);
|
||||||
Mangler mangler(Context, *_target->getTargetData());
|
Mangler mangler(Context, *_target->getTargetData());
|
||||||
|
|
||||||
// add functions
|
// add functions
|
||||||
|
Reference in New Issue
Block a user