aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2008-09-25 21:00:33 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2008-09-25 21:00:33 +0000
commit32b952a2a60d1091e0e17bb6ce788cd1d41e6f8b (patch)
treeecadc8690534554752eb68d3b76000b96f487b1e
parent0b457f0c3a7e21b1fb9ac8b9f8e404e1312b6a60 (diff)
downloadexternal_llvm-32b952a2a60d1091e0e17bb6ce788cd1d41e6f8b.zip
external_llvm-32b952a2a60d1091e0e17bb6ce788cd1d41e6f8b.tar.gz
external_llvm-32b952a2a60d1091e0e17bb6ce788cd1d41e6f8b.tar.bz2
Reapply 56585:56589 with proper fix for some gcc versions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56621 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Target/DarwinTargetAsmInfo.h2
-rw-r--r--include/llvm/Target/ELFTargetAsmInfo.h2
-rw-r--r--include/llvm/Target/TargetAsmInfo.h2
-rw-r--r--lib/Target/ARM/ARMTargetAsmInfo.cpp44
-rw-r--r--lib/Target/ARM/ARMTargetAsmInfo.h34
-rw-r--r--lib/Target/ARM/ARMTargetMachine.cpp2
-rw-r--r--lib/Target/PowerPC/PPCTargetAsmInfo.cpp17
-rw-r--r--lib/Target/PowerPC/PPCTargetAsmInfo.h33
-rw-r--r--lib/Target/TargetAsmInfo.cpp188
-rw-r--r--lib/Target/X86/X86TargetAsmInfo.cpp52
-rw-r--r--lib/Target/X86/X86TargetAsmInfo.h32
-rw-r--r--lib/Target/X86/X86TargetMachine.cpp2
12 files changed, 225 insertions, 185 deletions
diff --git a/include/llvm/Target/DarwinTargetAsmInfo.h b/include/llvm/Target/DarwinTargetAsmInfo.h
index 0ca5a70..dab591a 100644
--- a/include/llvm/Target/DarwinTargetAsmInfo.h
+++ b/include/llvm/Target/DarwinTargetAsmInfo.h
@@ -24,7 +24,7 @@ namespace llvm {
class Type;
class Mangler;
- struct DarwinTargetAsmInfo: public virtual TargetAsmInfo {
+ struct DarwinTargetAsmInfo: public TargetAsmInfo {
const Section* TextCoalSection;
const Section* ConstDataCoalSection;
const Section* ConstDataSection;
diff --git a/include/llvm/Target/ELFTargetAsmInfo.h b/include/llvm/Target/ELFTargetAsmInfo.h
index 3dacb33..593d9b1 100644
--- a/include/llvm/Target/ELFTargetAsmInfo.h
+++ b/include/llvm/Target/ELFTargetAsmInfo.h
@@ -23,7 +23,7 @@ namespace llvm {
class GlobalVariable;
class Type;
- struct ELFTargetAsmInfo: public virtual TargetAsmInfo {
+ struct ELFTargetAsmInfo: public TargetAsmInfo {
explicit ELFTargetAsmInfo(const TargetMachine &TM);
virtual const Section* SelectSectionForGlobal(const GlobalValue *GV) const;
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index c93d189..e3a8a57 100644
--- a/include/llvm/Target/TargetAsmInfo.h
+++ b/include/llvm/Target/TargetAsmInfo.h
@@ -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,
diff --git a/lib/Target/ARM/ARMTargetAsmInfo.cpp b/lib/Target/ARM/ARMTargetAsmInfo.cpp
index 7afbab3..10b570c 100644
--- a/lib/Target/ARM/ARMTargetAsmInfo.cpp
+++ b/lib/Target/ARM/ARMTargetAsmInfo.cpp
@@ -17,7 +17,7 @@
#include <cctype>
using namespace llvm;
-static const char *const arm_asm_table[] = {
+const char *const llvm::arm_asm_table[] = {
"{r0}", "r0",
"{r1}", "r1",
"{r2}", "r2",
@@ -42,21 +42,17 @@ static const char *const arm_asm_table[] = {
"{cc}", "cc",
0,0};
-ARMTargetAsmInfo::ARMTargetAsmInfo(const ARMTargetMachine &TM) {
- AsmTransCBE = arm_asm_table;
-
- AlignmentIsInBytes = false;
- Data64bitsDirective = 0;
- CommentString = "@";
- ConstantPoolSection = "\t.text\n";
- COMMDirectiveTakesAlignment = false;
- InlineAsmStart = "@ InlineAsm Start";
- InlineAsmEnd = "@ InlineAsm End";
- LCOMMDirective = "\t.lcomm\t";
-}
+// Instantiate 'common' cases.
+TEMPLATE_INSTANTIATION(class ARMTargetAsmInfo<TargetAsmInfo>);
+TEMPLATE_INSTANTIATION(
+unsigned ARMTargetAsmInfo<TargetAsmInfo>::getInlineAsmLength(const char*) const);
+TEMPLATE_INSTANTIATION(
+ unsigned ARMTargetAsmInfo<TargetAsmInfo>::countArguments(const char*) const);
+TEMPLATE_INSTANTIATION(
+ unsigned ARMTargetAsmInfo<TargetAsmInfo>::countString(const char*) const);
ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM):
- ARMTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) {
+ ARMTargetAsmInfo<DarwinTargetAsmInfo>(TM) {
Subtarget = &DTM->getSubtarget<ARMSubtarget>();
GlobalPrefix = "_";
@@ -104,7 +100,7 @@ ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM):
}
ARMELFTargetAsmInfo::ARMELFTargetAsmInfo(const ARMTargetMachine &TM):
- ARMTargetAsmInfo(TM), ELFTargetAsmInfo(TM) {
+ ARMTargetAsmInfo<ELFTargetAsmInfo>(TM) {
Subtarget = &ETM->getSubtarget<ARMSubtarget>();
NeedsSet = false;
@@ -138,13 +134,15 @@ ARMELFTargetAsmInfo::ARMELFTargetAsmInfo(const ARMTargetMachine &TM):
/// Count the number of comma-separated arguments.
/// Do not try to detect errors.
-unsigned ARMTargetAsmInfo::countArguments(const char* p) const {
+template <class BaseTAI>
+unsigned ARMTargetAsmInfo<BaseTAI>::countArguments(const char* p) const {
unsigned count = 0;
while (*p && isspace(*p) && *p != '\n')
p++;
count++;
- while (*p && *p!='\n' &&
- strncmp(p, CommentString, strlen(CommentString))!=0) {
+ while (*p && *p!='\n' &&
+ strncmp(p, BaseTAI::CommentString,
+ strlen(BaseTAI::CommentString))!=0) {
if (*p==',')
count++;
p++;
@@ -154,7 +152,8 @@ unsigned ARMTargetAsmInfo::countArguments(const char* p) const {
/// Count the length of a string enclosed in quote characters.
/// Do not try to detect errors.
-unsigned ARMTargetAsmInfo::countString(const char* p) const {
+template <class BaseTAI>
+unsigned ARMTargetAsmInfo<BaseTAI>::countString(const char* p) const {
unsigned count = 0;
while (*p && isspace(*p) && *p!='\n')
p++;
@@ -166,7 +165,8 @@ unsigned ARMTargetAsmInfo::countString(const char* p) const {
}
/// ARM-specific version of TargetAsmInfo::getInlineAsmLength.
-unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *s) const {
+template <class BaseTAI>
+unsigned ARMTargetAsmInfo<BaseTAI>::getInlineAsmLength(const char *s) const {
// Make a lowercase-folded version of s for counting purposes.
char *q, *s_copy = (char *)malloc(strlen(s) + 1);
strcpy(s_copy, s);
@@ -192,7 +192,7 @@ unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *s) const {
break;
}
// Ignore everything from comment char(s) to EOL
- if (strncmp(Str, CommentString, strlen(CommentString))==-0)
+ if (strncmp(Str, BaseTAI::CommentString, strlen(BaseTAI::CommentString))==-0)
atInsnStart = false;
// FIXME do something like the following for non-Darwin
else if (*Str == '.' && Subtarget->isTargetDarwin()) {
@@ -282,7 +282,7 @@ unsigned ARMTargetAsmInfo::getInlineAsmLength(const char *s) const {
Length += 4; // ARM
}
}
- if (*Str == '\n' || *Str == SeparatorChar)
+ if (*Str == '\n' || *Str == BaseTAI::SeparatorChar)
atInsnStart = true;
}
free(s_copy);
diff --git a/lib/Target/ARM/ARMTargetAsmInfo.h b/lib/Target/ARM/ARMTargetAsmInfo.h
index 9030d06..9e6f856 100644
--- a/lib/Target/ARM/ARMTargetAsmInfo.h
+++ b/lib/Target/ARM/ARMTargetAsmInfo.h
@@ -14,19 +14,31 @@
#ifndef ARMTARGETASMINFO_H
#define ARMTARGETASMINFO_H
+#include "ARMTargetMachine.h"
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/ELFTargetAsmInfo.h"
#include "llvm/Target/DarwinTargetAsmInfo.h"
-
-#include "ARMSubtarget.h"
+#include "llvm/Support/Compiler.h"
namespace llvm {
- // Forward declaration.
- class ARMTargetMachine;
+ extern const char *const arm_asm_table[];
+
+ template <class BaseTAI>
+ struct ARMTargetAsmInfo : public BaseTAI {
+ explicit ARMTargetAsmInfo(const ARMTargetMachine &TM):
+ BaseTAI(TM) {
+ BaseTAI::AsmTransCBE = arm_asm_table;
- struct ARMTargetAsmInfo : public virtual TargetAsmInfo {
- explicit ARMTargetAsmInfo(const ARMTargetMachine &TM);
+ BaseTAI::AlignmentIsInBytes = false;
+ BaseTAI::Data64bitsDirective = 0;
+ BaseTAI::CommentString = "@";
+ BaseTAI::ConstantPoolSection = "\t.text\n";
+ BaseTAI::COMMDirectiveTakesAlignment = false;
+ BaseTAI::InlineAsmStart = "@ InlineAsm Start";
+ BaseTAI::InlineAsmEnd = "@ InlineAsm End";
+ BaseTAI::LCOMMDirective = "\t.lcomm\t";
+ }
const ARMSubtarget *Subtarget;
@@ -35,13 +47,15 @@ namespace llvm {
unsigned countString(const char *p) const;
};
- struct ARMDarwinTargetAsmInfo : public virtual ARMTargetAsmInfo,
- public virtual DarwinTargetAsmInfo {
+ typedef ARMTargetAsmInfo<TargetAsmInfo> ARMGenericTargetAsmInfo;
+
+ EXTERN_TEMPLATE_INSTANTIATION(class ARMTargetAsmInfo<TargetAsmInfo>);
+
+ struct ARMDarwinTargetAsmInfo : public ARMTargetAsmInfo<DarwinTargetAsmInfo> {
explicit ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM);
};
- struct ARMELFTargetAsmInfo : public virtual ARMTargetAsmInfo,
- public virtual ELFTargetAsmInfo {
+ struct ARMELFTargetAsmInfo : public ARMTargetAsmInfo<ELFTargetAsmInfo> {
explicit ARMELFTargetAsmInfo(const ARMTargetMachine &TM);
};
diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp
index 0613078..29a9d84 100644
--- a/lib/Target/ARM/ARMTargetMachine.cpp
+++ b/lib/Target/ARM/ARMTargetMachine.cpp
@@ -120,7 +120,7 @@ const TargetAsmInfo *ARMTargetMachine::createTargetAsmInfo() const {
case ARMSubtarget::isELF:
return new ARMELFTargetAsmInfo(*this);
default:
- return new ARMTargetAsmInfo(*this);
+ return new ARMGenericTargetAsmInfo(*this);
}
}
diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
index 6988e78..717ddd6 100644
--- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
+++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
@@ -19,21 +19,10 @@
using namespace llvm;
using namespace llvm::dwarf;
-PPCTargetAsmInfo::PPCTargetAsmInfo(const PPCTargetMachine &TM) {
- bool isPPC64 = TM.getSubtargetImpl()->isPPC64();
-
- ZeroDirective = "\t.space\t";
- SetDirective = "\t.set";
- Data64bitsDirective = isPPC64 ? "\t.quad\t" : 0;
- AlignmentIsInBytes = false;
- LCOMMDirective = "\t.lcomm\t";
- InlineAsmStart = "# InlineAsm Start";
- InlineAsmEnd = "# InlineAsm End";
- AssemblerDialect = TM.getSubtargetImpl()->getAsmFlavor();
-}
+TEMPLATE_INSTANTIATION(class PPCTargetAsmInfo<TargetAsmInfo>);
PPCDarwinTargetAsmInfo::PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM):
- PPCTargetAsmInfo(TM), DarwinTargetAsmInfo(TM) {
+ PPCTargetAsmInfo<DarwinTargetAsmInfo>(TM) {
PCSymbol = ".";
CommentString = ";";
GlobalPrefix = "_";
@@ -103,7 +92,7 @@ PPCDarwinTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
PPCLinuxTargetAsmInfo::PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM) :
- PPCTargetAsmInfo(TM), ELFTargetAsmInfo(TM) {
+ PPCTargetAsmInfo<ELFTargetAsmInfo>(TM) {
CommentString = "#";
GlobalPrefix = "";
PrivateGlobalPrefix = "";
diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.h b/lib/Target/PowerPC/PPCTargetAsmInfo.h
index c3160e3..a533d5f 100644
--- a/lib/Target/PowerPC/PPCTargetAsmInfo.h
+++ b/lib/Target/PowerPC/PPCTargetAsmInfo.h
@@ -14,28 +14,43 @@
#ifndef PPCTARGETASMINFO_H
#define PPCTARGETASMINFO_H
+#include "PPCTargetMachine.h"
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/DarwinTargetAsmInfo.h"
#include "llvm/Target/ELFTargetAsmInfo.h"
+#include "llvm/Support/Compiler.h"
namespace llvm {
- // Forward declaration.
- class PPCTargetMachine;
-
- struct PPCTargetAsmInfo : public virtual TargetAsmInfo {
- explicit PPCTargetAsmInfo(const PPCTargetMachine &TM);
+ template <class BaseTAI>
+ struct PPCTargetAsmInfo : public BaseTAI {
+ explicit PPCTargetAsmInfo(const PPCTargetMachine &TM):
+ BaseTAI(TM) {
+ const PPCSubtarget *Subtarget = &TM.getSubtarget<PPCSubtarget>();
+ bool isPPC64 = Subtarget->isPPC64();
+
+ BaseTAI::ZeroDirective = "\t.space\t";
+ BaseTAI::SetDirective = "\t.set";
+ BaseTAI::Data64bitsDirective = isPPC64 ? "\t.quad\t" : 0;
+ BaseTAI::AlignmentIsInBytes = false;
+ BaseTAI::LCOMMDirective = "\t.lcomm\t";
+ BaseTAI::InlineAsmStart = "# InlineAsm Start";
+ BaseTAI::InlineAsmEnd = "# InlineAsm End";
+ BaseTAI::AssemblerDialect = Subtarget->getAsmFlavor();
+ }
};
- struct PPCDarwinTargetAsmInfo : public PPCTargetAsmInfo,
- public DarwinTargetAsmInfo {
+ typedef PPCTargetAsmInfo<TargetAsmInfo> PPCGenericTargetAsmInfo;
+
+ EXTERN_TEMPLATE_INSTANTIATION(class PPCTargetAsmInfo<TargetAsmInfo>);
+
+ struct PPCDarwinTargetAsmInfo : public PPCTargetAsmInfo<DarwinTargetAsmInfo> {
explicit PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM);
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
bool Global) const;
};
- struct PPCLinuxTargetAsmInfo : public PPCTargetAsmInfo,
- public ELFTargetAsmInfo {
+ struct PPCLinuxTargetAsmInfo : public PPCTargetAsmInfo<ELFTargetAsmInfo> {
explicit PPCLinuxTargetAsmInfo(const PPCTargetMachine &TM);
virtual unsigned PreferredEHDataFormat(DwarfEncoding::Target Reason,
bool Global) const;
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp
index 1c883ad..03fd326 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -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() {
}
diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp
index c6a76f2..fcd797e 100644
--- a/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -25,27 +25,26 @@
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};
-
-X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
- const X86Subtarget *Subtarget = &TM.getSubtarget<X86Subtarget>();
-
- AsmTransCBE = x86_asm_table;
-
- AssemblerDialect = Subtarget->getAsmFlavor();
-}
-
-bool X86TargetAsmInfo::LowerToBSwap(CallInst *CI) const {
+const char *const llvm::x86_asm_table[] = {
+ "{si}", "S",
+ "{di}", "D",
+ "{ax}", "a",
+ "{cx}", "c",
+ "{memory}", "memory",
+ "{flags}", "",
+ "{dirflag}", "",
+ "{fpsr}", "",
+ "{cc}", "cc",
+ 0,0};
+
+TEMPLATE_INSTANTIATION(class X86TargetAsmInfo<TargetAsmInfo>);
+TEMPLATE_INSTANTIATION(
+ bool X86TargetAsmInfo<TargetAsmInfo>::ExpandInlineAsm(CallInst*) const);
+TEMPLATE_INSTANTIATION(
+ bool X86TargetAsmInfo<TargetAsmInfo>::LowerToBSwap(CallInst*) 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 +73,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 +125,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 +225,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 +302,7 @@ X86ELFTargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
}
X86COFFTargetAsmInfo::X86COFFTargetAsmInfo(const X86TargetMachine &TM):
- X86TargetAsmInfo(TM) {
+ X86GenericTargetAsmInfo(TM) {
X86TM = &TM;
GlobalPrefix = "_";
@@ -408,7 +408,7 @@ std::string X86COFFTargetAsmInfo::printSectionFlags(unsigned flags) const {
}
X86WinTargetAsmInfo::X86WinTargetAsmInfo(const X86TargetMachine &TM):
- X86TargetAsmInfo(TM) {
+ X86GenericTargetAsmInfo(TM) {
GlobalPrefix = "_";
CommentString = ";";
diff --git a/lib/Target/X86/X86TargetAsmInfo.h b/lib/Target/X86/X86TargetAsmInfo.h
index d7e11e0..9100fc0 100644
--- a/lib/Target/X86/X86TargetAsmInfo.h
+++ b/lib/Target/X86/X86TargetAsmInfo.h
@@ -14,17 +14,25 @@
#ifndef X86TARGETASMINFO_H
#define X86TARGETASMINFO_H
+#include "X86TargetMachine.h"
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/ELFTargetAsmInfo.h"
#include "llvm/Target/DarwinTargetAsmInfo.h"
+#include "llvm/Support/Compiler.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 +40,23 @@ namespace llvm {
bool LowerToBSwap(CallInst *CI) const;
};
- struct X86DarwinTargetAsmInfo : public X86TargetAsmInfo,
- public DarwinTargetAsmInfo {
+ typedef X86TargetAsmInfo<TargetAsmInfo> X86GenericTargetAsmInfo;
+
+ EXTERN_TEMPLATE_INSTANTIATION(class X86TargetAsmInfo<TargetAsmInfo>);
+
+ 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 +67,11 @@ namespace llvm {
const X86TargetMachine *X86TM;
};
- struct X86WinTargetAsmInfo : public X86TargetAsmInfo {
+ struct X86WinTargetAsmInfo : public X86GenericTargetAsmInfo {
explicit X86WinTargetAsmInfo(const X86TargetMachine &TM);
};
+
} // namespace llvm
#endif
+
diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp
index 5be5c5d..08753e7 100644
--- a/lib/Target/X86/X86TargetMachine.cpp
+++ b/lib/Target/X86/X86TargetMachine.cpp
@@ -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);
}
}