mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +00:00
fcfd56262b
This recommits r208930, r208933, and r208975 (by reverting r209338) and reverts r209529 (the FIXME to readd this functionality once the tools were fixed) now that DWP has been fixed to cope with a single section for all fission type units. Original commit message: "Since type units in the dwo file are handled by a debug aware tool, they don't need to leverage the ELF comdat grouping to implement deduplication. Avoid creating all the .group sections for these as a space optimization." git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213956 91177308-0d34-0410-b5e6-96231b3b80d8
394 lines
14 KiB
C++
394 lines
14 KiB
C++
//===-- 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/ADT/Triple.h"
|
|
#include "llvm/Support/CodeGen.h"
|
|
|
|
namespace llvm {
|
|
class MCContext;
|
|
class MCSection;
|
|
class StringRef;
|
|
|
|
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;
|
|
|
|
/// SupportsCompactUnwindWithoutEHFrame - True if the target object file
|
|
/// supports emitting a compact unwind section without an associated EH frame
|
|
/// section.
|
|
bool SupportsCompactUnwindWithoutEHFrame;
|
|
|
|
/// PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values
|
|
/// for EH.
|
|
unsigned PersonalityEncoding;
|
|
unsigned LSDAEncoding;
|
|
unsigned FDECFIEncoding;
|
|
unsigned TTypeEncoding;
|
|
|
|
/// Section flags for eh_frame
|
|
unsigned EHSectionType;
|
|
unsigned EHSectionFlags;
|
|
|
|
/// CompactUnwindDwarfEHFrameOnly - Compact unwind encoding indicating that we
|
|
/// should emit only an EH frame.
|
|
unsigned CompactUnwindDwarfEHFrameOnly;
|
|
|
|
/// 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 *DwarfPubTypesSection;
|
|
const MCSection *DwarfDebugInlineSection;
|
|
const MCSection *DwarfStrSection;
|
|
const MCSection *DwarfLocSection;
|
|
const MCSection *DwarfARangesSection;
|
|
const MCSection *DwarfRangesSection;
|
|
const MCSection *DwarfMacroInfoSection;
|
|
// The pubnames section is no longer generated by default. The generation
|
|
// can be enabled by a compiler flag.
|
|
const MCSection *DwarfPubNamesSection;
|
|
|
|
// DWARF5 Experimental Debug Info Sections
|
|
/// DwarfAccelNamesSection, DwarfAccelObjCSection,
|
|
/// DwarfAccelNamespaceSection, DwarfAccelTypesSection -
|
|
/// If we use the DWARF accelerated hash tables then we want to emit these
|
|
/// sections.
|
|
const MCSection *DwarfAccelNamesSection;
|
|
const MCSection *DwarfAccelObjCSection;
|
|
const MCSection *DwarfAccelNamespaceSection;
|
|
const MCSection *DwarfAccelTypesSection;
|
|
|
|
/// These are used for the Fission separate debug information files.
|
|
const MCSection *DwarfInfoDWOSection;
|
|
const MCSection *DwarfTypesDWOSection;
|
|
const MCSection *DwarfAbbrevDWOSection;
|
|
const MCSection *DwarfStrDWOSection;
|
|
const MCSection *DwarfLineDWOSection;
|
|
const MCSection *DwarfLocDWOSection;
|
|
const MCSection *DwarfStrOffDWOSection;
|
|
const MCSection *DwarfAddrSection;
|
|
|
|
/// Sections for newer gnu pubnames and pubtypes.
|
|
const MCSection *DwarfGnuPubNamesSection;
|
|
const MCSection *DwarfGnuPubTypesSection;
|
|
|
|
const MCSection *COFFDebugSymbolsSection;
|
|
|
|
// 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, MachO and COFF.
|
|
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".
|
|
|
|
/// StackMap section.
|
|
const MCSection *StackMapSection;
|
|
|
|
/// 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, CodeModel::Model CM,
|
|
MCContext &ctx);
|
|
|
|
bool getSupportsWeakOmittedEHFrame() const {
|
|
return SupportsWeakOmittedEHFrame;
|
|
}
|
|
bool getSupportsCompactUnwindWithoutEHFrame() const {
|
|
return SupportsCompactUnwindWithoutEHFrame;
|
|
}
|
|
bool getCommDirectiveSupportsAlignment() const {
|
|
return CommDirectiveSupportsAlignment;
|
|
}
|
|
|
|
unsigned getPersonalityEncoding() const { return PersonalityEncoding; }
|
|
unsigned getLSDAEncoding() const { return LSDAEncoding; }
|
|
unsigned getFDEEncoding() const { return FDECFIEncoding; }
|
|
unsigned getTTypeEncoding() const { return TTypeEncoding; }
|
|
|
|
unsigned getCompactUnwindDwarfEHFrameOnly() const {
|
|
return CompactUnwindDwarfEHFrameOnly;
|
|
}
|
|
|
|
const MCSection *getTextSection() const { return TextSection; }
|
|
const MCSection *getDataSection() const { return DataSection; }
|
|
const MCSection *getBSSSection() const { return BSSSection; }
|
|
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 *getDwarfGnuPubNamesSection() const {
|
|
return DwarfGnuPubNamesSection;
|
|
}
|
|
const MCSection *getDwarfGnuPubTypesSection() const {
|
|
return DwarfGnuPubTypesSection;
|
|
}
|
|
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;
|
|
}
|
|
|
|
// DWARF5 Experimental Debug Info Sections
|
|
const MCSection *getDwarfAccelNamesSection() const {
|
|
return DwarfAccelNamesSection;
|
|
}
|
|
const MCSection *getDwarfAccelObjCSection() const {
|
|
return DwarfAccelObjCSection;
|
|
}
|
|
const MCSection *getDwarfAccelNamespaceSection() const {
|
|
return DwarfAccelNamespaceSection;
|
|
}
|
|
const MCSection *getDwarfAccelTypesSection() const {
|
|
return DwarfAccelTypesSection;
|
|
}
|
|
const MCSection *getDwarfInfoDWOSection() const {
|
|
return DwarfInfoDWOSection;
|
|
}
|
|
const MCSection *getDwarfTypesSection(uint64_t Hash) const;
|
|
const MCSection *getDwarfTypesDWOSection() const {
|
|
return DwarfTypesDWOSection;
|
|
}
|
|
const MCSection *getDwarfAbbrevDWOSection() const {
|
|
return DwarfAbbrevDWOSection;
|
|
}
|
|
const MCSection *getDwarfStrDWOSection() const {
|
|
return DwarfStrDWOSection;
|
|
}
|
|
const MCSection *getDwarfLineDWOSection() const {
|
|
return DwarfLineDWOSection;
|
|
}
|
|
const MCSection *getDwarfLocDWOSection() const {
|
|
return DwarfLocDWOSection;
|
|
}
|
|
const MCSection *getDwarfStrOffDWOSection() const {
|
|
return DwarfStrOffDWOSection;
|
|
}
|
|
const MCSection *getDwarfAddrSection() const {
|
|
return DwarfAddrSection;
|
|
}
|
|
|
|
const MCSection *getCOFFDebugSymbolsSection() const {
|
|
return COFFDebugSymbolsSection;
|
|
}
|
|
|
|
const MCSection *getTLSExtraDataSection() const {
|
|
return TLSExtraDataSection;
|
|
}
|
|
const MCSection *getTLSDataSection() const { return TLSDataSection; }
|
|
const MCSection *getTLSBSSSection() const { return TLSBSSSection; }
|
|
|
|
const MCSection *getStackMapSection() const { return StackMapSection; }
|
|
|
|
/// 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;
|
|
}
|
|
|
|
enum Environment { IsMachO, IsELF, IsCOFF };
|
|
Environment getObjectFileType() const {
|
|
return Env;
|
|
}
|
|
|
|
Reloc::Model getRelocM() const {
|
|
return RelocM;
|
|
}
|
|
|
|
private:
|
|
Environment Env;
|
|
Reloc::Model RelocM;
|
|
CodeModel::Model CMModel;
|
|
MCContext *Ctx;
|
|
Triple TT;
|
|
|
|
void InitMachOMCObjectFileInfo(Triple T);
|
|
void InitELFMCObjectFileInfo(Triple T);
|
|
void InitCOFFMCObjectFileInfo(Triple T);
|
|
|
|
/// InitEHFrameSection - Initialize EHFrameSection on demand.
|
|
///
|
|
void InitEHFrameSection();
|
|
|
|
public:
|
|
const Triple &getTargetTriple() const { return TT; }
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|