mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-14 17:34:41 +00:00
Use crazy template-based inheritance instead of virtual one.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56585 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
541af7f769
commit
8490322fa9
@ -124,6 +124,7 @@ namespace llvm {
|
||||
private:
|
||||
mutable StringMap<Section> Sections;
|
||||
mutable SectionFlags::FlagsStringsMapType FlagsStrings;
|
||||
void fillDefaultValues();
|
||||
protected:
|
||||
//===------------------------------------------------------------------===//
|
||||
// Properties to be set by the target writer, used to configure asm printer.
|
||||
@ -510,6 +511,7 @@ namespace llvm {
|
||||
|
||||
public:
|
||||
TargetAsmInfo();
|
||||
TargetAsmInfo(const TargetMachine &TM);
|
||||
virtual ~TargetAsmInfo();
|
||||
|
||||
const Section* getNamedSection(const char *Name,
|
||||
|
@ -25,100 +25,108 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
TargetAsmInfo::TargetAsmInfo() :
|
||||
TextSection(0),
|
||||
DataSection(0),
|
||||
BSSSection("\t.bss"),
|
||||
BSSSection_(0),
|
||||
ReadOnlySection(0),
|
||||
SmallDataSection(0),
|
||||
SmallBSSSection(0),
|
||||
SmallRODataSection(0),
|
||||
TLSDataSection(0),
|
||||
TLSBSSSection(0),
|
||||
ZeroFillDirective(0),
|
||||
NonexecutableStackDirective(0),
|
||||
NeedsSet(false),
|
||||
MaxInstLength(4),
|
||||
PCSymbol("$"),
|
||||
SeparatorChar(';'),
|
||||
CommentString("#"),
|
||||
GlobalPrefix(""),
|
||||
PrivateGlobalPrefix("."),
|
||||
LessPrivateGlobalPrefix(""),
|
||||
JumpTableSpecialLabelPrefix(0),
|
||||
GlobalVarAddrPrefix(""),
|
||||
GlobalVarAddrSuffix(""),
|
||||
FunctionAddrPrefix(""),
|
||||
FunctionAddrSuffix(""),
|
||||
PersonalityPrefix(""),
|
||||
PersonalitySuffix(""),
|
||||
NeedsIndirectEncoding(false),
|
||||
InlineAsmStart("#APP"),
|
||||
InlineAsmEnd("#NO_APP"),
|
||||
AssemblerDialect(0),
|
||||
StringConstantPrefix(".str"),
|
||||
ZeroDirective("\t.zero\t"),
|
||||
ZeroDirectiveSuffix(0),
|
||||
AsciiDirective("\t.ascii\t"),
|
||||
AscizDirective("\t.asciz\t"),
|
||||
Data8bitsDirective("\t.byte\t"),
|
||||
Data16bitsDirective("\t.short\t"),
|
||||
Data32bitsDirective("\t.long\t"),
|
||||
Data64bitsDirective("\t.quad\t"),
|
||||
AlignDirective("\t.align\t"),
|
||||
AlignmentIsInBytes(true),
|
||||
TextAlignFillValue(0),
|
||||
SwitchToSectionDirective("\t.section\t"),
|
||||
TextSectionStartSuffix(""),
|
||||
DataSectionStartSuffix(""),
|
||||
SectionEndDirectiveSuffix(0),
|
||||
ConstantPoolSection("\t.section .rodata"),
|
||||
JumpTableDataSection("\t.section .rodata"),
|
||||
JumpTableDirective(0),
|
||||
CStringSection(0),
|
||||
CStringSection_(0),
|
||||
StaticCtorsSection("\t.section .ctors,\"aw\",@progbits"),
|
||||
StaticDtorsSection("\t.section .dtors,\"aw\",@progbits"),
|
||||
GlobalDirective("\t.globl\t"),
|
||||
SetDirective(0),
|
||||
LCOMMDirective(0),
|
||||
COMMDirective("\t.comm\t"),
|
||||
COMMDirectiveTakesAlignment(true),
|
||||
HasDotTypeDotSizeDirective(true),
|
||||
UsedDirective(0),
|
||||
WeakRefDirective(0),
|
||||
WeakDefDirective(0),
|
||||
HiddenDirective("\t.hidden\t"),
|
||||
ProtectedDirective("\t.protected\t"),
|
||||
AbsoluteDebugSectionOffsets(false),
|
||||
AbsoluteEHSectionOffsets(false),
|
||||
HasLEB128(false),
|
||||
HasDotLocAndDotFile(false),
|
||||
SupportsDebugInformation(false),
|
||||
SupportsExceptionHandling(false),
|
||||
DwarfRequiresFrameSection(true),
|
||||
GlobalEHDirective(0),
|
||||
SupportsWeakOmittedEHFrame(true),
|
||||
DwarfSectionOffsetDirective(0),
|
||||
DwarfAbbrevSection(".debug_abbrev"),
|
||||
DwarfInfoSection(".debug_info"),
|
||||
DwarfLineSection(".debug_line"),
|
||||
DwarfFrameSection(".debug_frame"),
|
||||
DwarfPubNamesSection(".debug_pubnames"),
|
||||
DwarfPubTypesSection(".debug_pubtypes"),
|
||||
DwarfStrSection(".debug_str"),
|
||||
DwarfLocSection(".debug_loc"),
|
||||
DwarfARangesSection(".debug_aranges"),
|
||||
DwarfRangesSection(".debug_ranges"),
|
||||
DwarfMacInfoSection(".debug_macinfo"),
|
||||
DwarfEHFrameSection(".eh_frame"),
|
||||
DwarfExceptionSection(".gcc_except_table"),
|
||||
AsmTransCBE(0) {
|
||||
void TargetAsmInfo::fillDefaultValues() {
|
||||
BSSSection = "\t.bss";
|
||||
BSSSection_ = 0;
|
||||
ReadOnlySection = 0;
|
||||
SmallDataSection = 0;
|
||||
SmallBSSSection = 0;
|
||||
SmallRODataSection = 0;
|
||||
TLSDataSection = 0;
|
||||
TLSBSSSection = 0;
|
||||
ZeroFillDirective = 0;
|
||||
NonexecutableStackDirective = 0;
|
||||
NeedsSet = false;
|
||||
MaxInstLength = 4;
|
||||
PCSymbol = "$";
|
||||
SeparatorChar = ';';
|
||||
CommentString = "#";
|
||||
GlobalPrefix = "";
|
||||
PrivateGlobalPrefix = ".";
|
||||
LessPrivateGlobalPrefix = "";
|
||||
JumpTableSpecialLabelPrefix = 0;
|
||||
GlobalVarAddrPrefix = "";
|
||||
GlobalVarAddrSuffix = "";
|
||||
FunctionAddrPrefix = "";
|
||||
FunctionAddrSuffix = "";
|
||||
PersonalityPrefix = "";
|
||||
PersonalitySuffix = "";
|
||||
NeedsIndirectEncoding = false;
|
||||
InlineAsmStart = "#APP";
|
||||
InlineAsmEnd = "#NO_APP";
|
||||
AssemblerDialect = 0;
|
||||
StringConstantPrefix = ".str";
|
||||
ZeroDirective = "\t.zero\t";
|
||||
ZeroDirectiveSuffix = 0;
|
||||
AsciiDirective = "\t.ascii\t";
|
||||
AscizDirective = "\t.asciz\t";
|
||||
Data8bitsDirective = "\t.byte\t";
|
||||
Data16bitsDirective = "\t.short\t";
|
||||
Data32bitsDirective = "\t.long\t";
|
||||
Data64bitsDirective = "\t.quad\t";
|
||||
AlignDirective = "\t.align\t";
|
||||
AlignmentIsInBytes = true;
|
||||
TextAlignFillValue = 0;
|
||||
SwitchToSectionDirective = "\t.section\t";
|
||||
TextSectionStartSuffix = "";
|
||||
DataSectionStartSuffix = "";
|
||||
SectionEndDirectiveSuffix = 0;
|
||||
ConstantPoolSection = "\t.section .rodata";
|
||||
JumpTableDataSection = "\t.section .rodata";
|
||||
JumpTableDirective = 0;
|
||||
CStringSection = 0;
|
||||
CStringSection_ = 0;
|
||||
// FIXME: Flags are ELFish - replace with normal section stuff.
|
||||
StaticCtorsSection = "\t.section .ctors,\"aw\",@progbits";
|
||||
StaticDtorsSection = "\t.section .dtors,\"aw\",@progbits";
|
||||
GlobalDirective = "\t.globl\t";
|
||||
SetDirective = 0;
|
||||
LCOMMDirective = 0;
|
||||
COMMDirective = "\t.comm\t";
|
||||
COMMDirectiveTakesAlignment = true;
|
||||
HasDotTypeDotSizeDirective = true;
|
||||
UsedDirective = 0;
|
||||
WeakRefDirective = 0;
|
||||
WeakDefDirective = 0;
|
||||
// FIXME: These are ELFish - move to ELFTAI.
|
||||
HiddenDirective = "\t.hidden\t";
|
||||
ProtectedDirective = "\t.protected\t";
|
||||
AbsoluteDebugSectionOffsets = false;
|
||||
AbsoluteEHSectionOffsets = false;
|
||||
HasLEB128 = false;
|
||||
HasDotLocAndDotFile = false;
|
||||
SupportsDebugInformation = false;
|
||||
SupportsExceptionHandling = false;
|
||||
DwarfRequiresFrameSection = true;
|
||||
GlobalEHDirective = 0;
|
||||
SupportsWeakOmittedEHFrame = true;
|
||||
DwarfSectionOffsetDirective = 0;
|
||||
DwarfAbbrevSection = ".debug_abbrev";
|
||||
DwarfInfoSection = ".debug_info";
|
||||
DwarfLineSection = ".debug_line";
|
||||
DwarfFrameSection = ".debug_frame";
|
||||
DwarfPubNamesSection = ".debug_pubnames";
|
||||
DwarfPubTypesSection = ".debug_pubtypes";
|
||||
DwarfStrSection = ".debug_str";
|
||||
DwarfLocSection = ".debug_loc";
|
||||
DwarfARangesSection = ".debug_aranges";
|
||||
DwarfRangesSection = ".debug_ranges";
|
||||
DwarfMacInfoSection = ".debug_macinfo";
|
||||
DwarfEHFrameSection = ".eh_frame";
|
||||
DwarfExceptionSection = ".gcc_except_table";
|
||||
AsmTransCBE = 0;
|
||||
TextSection = getUnnamedSection("\t.text", SectionFlags::Code);
|
||||
DataSection = getUnnamedSection("\t.data", SectionFlags::Writeable);
|
||||
}
|
||||
|
||||
TargetAsmInfo::TargetAsmInfo() {
|
||||
fillDefaultValues();
|
||||
}
|
||||
|
||||
TargetAsmInfo::TargetAsmInfo(const TargetMachine &TM) {
|
||||
fillDefaultValues();
|
||||
}
|
||||
|
||||
TargetAsmInfo::~TargetAsmInfo() {
|
||||
}
|
||||
|
||||
|
@ -25,27 +25,20 @@
|
||||
using namespace llvm;
|
||||
using namespace llvm::dwarf;
|
||||
|
||||
static const char *const x86_asm_table[] = {
|
||||
"{si}", "S",
|
||||
"{di}", "D",
|
||||
"{ax}", "a",
|
||||
"{cx}", "c",
|
||||
"{memory}", "memory",
|
||||
"{flags}", "",
|
||||
"{dirflag}", "",
|
||||
"{fpsr}", "",
|
||||
"{cc}", "cc",
|
||||
0,0};
|
||||
const char *const llvm::x86_asm_table[] = {
|
||||
"{si}", "S",
|
||||
"{di}", "D",
|
||||
"{ax}", "a",
|
||||
"{cx}", "c",
|
||||
"{memory}", "memory",
|
||||
"{flags}", "",
|
||||
"{dirflag}", "",
|
||||
"{fpsr}", "",
|
||||
"{cc}", "cc",
|
||||
0,0};
|
||||
|
||||
X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
|
||||
const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
|
||||
|
||||
AsmTransCBE = x86_asm_table;
|
||||
|
||||
AssemblerDialect = Subtarget->getAsmFlavor();
|
||||
}
|
||||
|
||||
bool X86TargetAsmInfo::LowerToBSwap(CallInst *CI) const {
|
||||
template <class BaseTAI>
|
||||
bool X86TargetAsmInfo<BaseTAI>::LowerToBSwap(CallInst *CI) const {
|
||||
// FIXME: this should verify that we are targetting a 486 or better. If not,
|
||||
// we will turn this bswap into something that will be lowered to logical ops
|
||||
// instead of emitting the bswap asm. For now, we don't support 486 or lower
|
||||
@ -74,7 +67,8 @@ bool X86TargetAsmInfo::LowerToBSwap(CallInst *CI) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool X86TargetAsmInfo::ExpandInlineAsm(CallInst *CI) const {
|
||||
template <class BaseTAI>
|
||||
bool X86TargetAsmInfo<BaseTAI>::ExpandInlineAsm(CallInst *CI) const {
|
||||
InlineAsm *IA = cast<InlineAsm>(CI->getCalledValue());
|
||||
std::vector<InlineAsm::ConstraintInfo> Constraints = IA->ParseConstraints();
|
||||
|
||||
@ -125,7 +119,7 @@ bool X86TargetAsmInfo::ExpandInlineAsm(CallInst *CI) const {
|
||||
}
|
||||
|
||||
X86DarwinTargetAsmInfo::X86DarwinTargetAsmInfo(const X86TargetMachine &TM):
|
||||
X86TargetAsmInfo(TM), DarwinTargetAsmInfo(TM) {
|
||||
X86TargetAsmInfo<DarwinTargetAsmInfo>(TM) {
|
||||
const X86Subtarget* Subtarget = &DTM->getSubtarget<X86Subtarget>();
|
||||
bool is64Bit = Subtarget->is64Bit();
|
||||
|
||||
@ -225,7 +219,7 @@ X86DarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
||||
}
|
||||
|
||||
X86ELFTargetAsmInfo::X86ELFTargetAsmInfo(const X86TargetMachine &TM):
|
||||
X86TargetAsmInfo(TM), ELFTargetAsmInfo(TM) {
|
||||
X86TargetAsmInfo<ELFTargetAsmInfo>(TM) {
|
||||
|
||||
CStringSection = ".rodata.str";
|
||||
PrivateGlobalPrefix = ".L";
|
||||
@ -302,7 +296,7 @@ X86ELFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
||||
}
|
||||
|
||||
X86COFFTargetAsmInfo::X86COFFTargetAsmInfo(const X86TargetMachine &TM):
|
||||
X86TargetAsmInfo(TM) {
|
||||
X86GenericTargetAsmInfo(TM) {
|
||||
X86TM = &TM;
|
||||
|
||||
GlobalPrefix = "_";
|
||||
@ -408,7 +402,7 @@ std::string X86COFFTargetAsmInfo::printSectionFlags(unsigned flags) const {
|
||||
}
|
||||
|
||||
X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM):
|
||||
X86TargetAsmInfo(TM) {
|
||||
X86GenericTargetAsmInfo(TM) {
|
||||
GlobalPrefix = "_";
|
||||
CommentString = ";";
|
||||
|
||||
|
@ -14,17 +14,24 @@
|
||||
#ifndef X86TARGETASMINFO_H
|
||||
#define X86TARGETASMINFO_H
|
||||
|
||||
#include "X86TargetMachine.h"
|
||||
#include "llvm/Target/TargetAsmInfo.h"
|
||||
#include "llvm/Target/ELFTargetAsmInfo.h"
|
||||
#include "llvm/Target/DarwinTargetAsmInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
// Forward declaration.
|
||||
class X86TargetMachine;
|
||||
extern const char *const x86_asm_table[];
|
||||
|
||||
struct X86TargetAsmInfo : public virtual TargetAsmInfo {
|
||||
explicit X86TargetAsmInfo(const X86TargetMachine &TM);
|
||||
template <class BaseTAI>
|
||||
struct X86TargetAsmInfo : public BaseTAI {
|
||||
explicit X86TargetAsmInfo(const X86TargetMachine &TM):
|
||||
BaseTAI(TM) {
|
||||
const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
|
||||
|
||||
BaseTAI::AsmTransCBE = x86_asm_table;
|
||||
BaseTAI::AssemblerDialect = Subtarget->getAsmFlavor();
|
||||
}
|
||||
|
||||
virtual bool ExpandInlineAsm(CallInst *CI) const;
|
||||
|
||||
@ -32,21 +39,21 @@ namespace llvm {
|
||||
bool LowerToBSwap(CallInst *CI) const;
|
||||
};
|
||||
|
||||
struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo,
|
||||
public DarwinTargetAsmInfo {
|
||||
typedef X86TargetAsmInfo<TargetAsmInfo> X86GenericTargetAsmInfo;
|
||||
|
||||
struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo<DarwinTargetAsmInfo> {
|
||||
explicit X86DarwinTargetAsmInfo(const X86TargetMachine &TM);
|
||||
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
||||
bool Global) const;
|
||||
};
|
||||
|
||||
struct X86ELFTargetAsmInfo : public X86TargetAsmInfo,
|
||||
public ELFTargetAsmInfo {
|
||||
struct X86ELFTargetAsmInfo : public X86TargetAsmInfo<ELFTargetAsmInfo> {
|
||||
explicit X86ELFTargetAsmInfo(const X86TargetMachine &TM);
|
||||
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
||||
bool Global) const;
|
||||
};
|
||||
|
||||
struct X86COFFTargetAsmInfo : public X86TargetAsmInfo {
|
||||
struct X86COFFTargetAsmInfo : public X86GenericTargetAsmInfo {
|
||||
explicit X86COFFTargetAsmInfo(const X86TargetMachine &TM);
|
||||
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
|
||||
bool Global) const;
|
||||
@ -57,9 +64,11 @@ namespace llvm {
|
||||
const X86TargetMachine *X86TM;
|
||||
};
|
||||
|
||||
struct X86WinTargetAsmInfo : public X86TargetAsmInfo {
|
||||
struct X86WinTargetAsmInfo : public X86GenericTargetAsmInfo {
|
||||
explicit X86WinTargetAsmInfo(const X86TargetMachine &TM);
|
||||
};
|
||||
|
||||
} // namespace llvm
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -54,7 +54,7 @@ const TargetAsmInfo *X86TargetMachine::createTargetAsmInfo() const {
|
||||
case X86Subtarget::isWindows:
|
||||
return new X86WinTargetAsmInfo(*this);
|
||||
default:
|
||||
return new X86TargetAsmInfo(*this);
|
||||
return new X86GenericTargetAsmInfo(*this);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user