[llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp DwarfWriter.cpp
Jim Laskey
jlaskey at apple.com
Wed Sep 6 11:35:06 PDT 2006
Changes in directory llvm/lib/CodeGen:
AsmPrinter.cpp updated: 1.90 -> 1.91
DwarfWriter.cpp updated: 1.73 -> 1.74
---
Log message:
Separate target specific asm properties from the asm printers.
---
Diffs of the changes: (+169 -212)
AsmPrinter.cpp | 237 ++++++++++++++++++++++++--------------------------------
DwarfWriter.cpp | 144 +++++++++++++++-------------------
2 files changed, 169 insertions(+), 212 deletions(-)
Index: llvm/lib/CodeGen/AsmPrinter.cpp
diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.90 llvm/lib/CodeGen/AsmPrinter.cpp:1.91
--- llvm/lib/CodeGen/AsmPrinter.cpp:1.90 Tue Sep 5 15:02:51 2006
+++ llvm/lib/CodeGen/AsmPrinter.cpp Wed Sep 6 13:34:40 2006
@@ -20,51 +20,16 @@
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/Support/Mangler.h"
#include "llvm/Support/MathExtras.h"
+#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
#include <iostream>
#include <cerrno>
using namespace llvm;
-AsmPrinter::AsmPrinter(std::ostream &o, TargetMachine &tm)
-: FunctionNumber(0), O(o), TM(tm),
- CommentString("#"),
- GlobalPrefix(""),
- PrivateGlobalPrefix("."),
- GlobalVarAddrPrefix(""),
- GlobalVarAddrSuffix(""),
- FunctionAddrPrefix(""),
- FunctionAddrSuffix(""),
- InlineAsmStart("#APP"),
- InlineAsmEnd("#NO_APP"),
- 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),
- SwitchToSectionDirective("\t.section\t"),
- TextSectionStartSuffix(""),
- DataSectionStartSuffix(""),
- SectionEndDirectiveSuffix(0),
- ConstantPoolSection("\t.section .rodata\n"),
- JumpTableDataSection("\t.section .rodata\n"),
- JumpTableTextSection("\t.text\n"),
- StaticCtorsSection("\t.section .ctors,\"aw\", at progbits"),
- StaticDtorsSection("\t.section .dtors,\"aw\", at progbits"),
- FourByteConstantSection(0),
- EightByteConstantSection(0),
- SixteenByteConstantSection(0),
- SetDirective(0),
- LCOMMDirective(0),
- COMMDirective("\t.comm\t"),
- COMMDirectiveTakesAlignment(true),
- HasDotTypeDotSizeDirective(true) {
-}
+AsmPrinter::AsmPrinter(std::ostream &o, TargetMachine &tm, TargetAsmInfo *T)
+: FunctionNumber(0), O(o), TM(tm), TAI(T)
+{}
/// SwitchToTextSection - Switch to the specified text section of the executable
@@ -74,7 +39,7 @@
const GlobalValue *GV) {
std::string NS;
if (GV && GV->hasSection())
- NS = SwitchToSectionDirective + GV->getSection();
+ NS = TAI->getSwitchToSectionDirective() + GV->getSection();
else
NS = NewSection;
@@ -82,13 +47,13 @@
if (CurrentSection == NS) return;
// Close the current section, if applicable.
- if (SectionEndDirectiveSuffix && !CurrentSection.empty())
- O << CurrentSection << SectionEndDirectiveSuffix << "\n";
+ if (TAI->getSectionEndDirectiveSuffix() && !CurrentSection.empty())
+ O << CurrentSection << TAI->getSectionEndDirectiveSuffix() << "\n";
CurrentSection = NS;
if (!CurrentSection.empty())
- O << CurrentSection << TextSectionStartSuffix << '\n';
+ O << CurrentSection << TAI->getTextSectionStartSuffix() << '\n';
}
/// SwitchToDataSection - Switch to the specified data section of the executable
@@ -98,7 +63,7 @@
const GlobalValue *GV) {
std::string NS;
if (GV && GV->hasSection())
- NS = SwitchToSectionDirective + GV->getSection();
+ NS = TAI->getSwitchToSectionDirective() + GV->getSection();
else
NS = NewSection;
@@ -106,23 +71,24 @@
if (CurrentSection == NS) return;
// Close the current section, if applicable.
- if (SectionEndDirectiveSuffix && !CurrentSection.empty())
- O << CurrentSection << SectionEndDirectiveSuffix << "\n";
+ if (TAI->getSectionEndDirectiveSuffix() && !CurrentSection.empty())
+ O << CurrentSection << TAI->getSectionEndDirectiveSuffix() << "\n";
CurrentSection = NS;
if (!CurrentSection.empty())
- O << CurrentSection << DataSectionStartSuffix << '\n';
+ O << CurrentSection << TAI->getDataSectionStartSuffix() << '\n';
}
bool AsmPrinter::doInitialization(Module &M) {
- Mang = new Mangler(M, GlobalPrefix);
+ Mang = new Mangler(M, TAI->getGlobalPrefix());
if (!M.getModuleInlineAsm().empty())
- O << CommentString << " Start of file scope inline assembly\n"
+ O << TAI->getCommentString() << " Start of file scope inline assembly\n"
<< M.getModuleInlineAsm()
- << "\n" << CommentString << " End of file scope inline assembly\n";
+ << "\n" << TAI->getCommentString()
+ << " End of file scope inline assembly\n";
SwitchToDataSection("", 0); // Reset back to no section.
@@ -163,13 +129,13 @@
MachineConstantPoolEntry CPE = CP[i];
const Constant *CV = CPE.Val;
const Type *Ty = CV->getType();
- if (FourByteConstantSection &&
+ if (TAI->getFourByteConstantSection() &&
TM.getTargetData()->getTypeSize(Ty) == 4)
FourByteCPs.push_back(std::make_pair(CPE, i));
- else if (EightByteConstantSection &&
+ else if (TAI->getSectionEndDirectiveSuffix() &&
TM.getTargetData()->getTypeSize(Ty) == 8)
EightByteCPs.push_back(std::make_pair(CPE, i));
- else if (SixteenByteConstantSection &&
+ else if (TAI->getSectionEndDirectiveSuffix() &&
TM.getTargetData()->getTypeSize(Ty) == 16)
SixteenByteCPs.push_back(std::make_pair(CPE, i));
else
@@ -177,10 +143,11 @@
}
unsigned Alignment = MCP->getConstantPoolAlignment();
- EmitConstantPool(Alignment, FourByteConstantSection, FourByteCPs);
- EmitConstantPool(Alignment, EightByteConstantSection, EightByteCPs);
- EmitConstantPool(Alignment, SixteenByteConstantSection, SixteenByteCPs);
- EmitConstantPool(Alignment, ConstantPoolSection, OtherCPs);
+ EmitConstantPool(Alignment, TAI->getFourByteConstantSection(), FourByteCPs);
+ EmitConstantPool(Alignment, TAI->getEightByteConstantSection(), EightByteCPs);
+ EmitConstantPool(Alignment, TAI->getSixteenByteConstantSection(),
+ SixteenByteCPs);
+ EmitConstantPool(Alignment, TAI->getConstantPoolSection(), OtherCPs);
}
void AsmPrinter::EmitConstantPool(unsigned Alignment, const char *Section,
@@ -190,8 +157,8 @@
SwitchToDataSection(Section, 0);
EmitAlignment(Alignment);
for (unsigned i = 0, e = CP.size(); i != e; ++i) {
- O << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << '_'
- << CP[i].second << ":\t\t\t\t\t" << CommentString << " ";
+ O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
+ << CP[i].second << ":\t\t\t\t\t" << TAI->getCommentString() << " ";
WriteTypeSymbolic(O, CP[i].first.Val->getType(), 0) << '\n';
EmitGlobalConstant(CP[i].first.Val);
if (i != e-1) {
@@ -215,16 +182,16 @@
// JTEntryDirective is a string to print sizeof(ptr) for non-PIC jump tables,
// and 32 bits for PIC since PIC jump table entries are differences, not
// pointers to blocks.
- const char *JTEntryDirective = Data32bitsDirective;
+ const char *JTEntryDirective = TAI->getData32bitsDirective();
// Pick the directive to use to print the jump table entries, and switch to
// the appropriate section.
if (TM.getRelocationModel() == Reloc::PIC_) {
- SwitchToTextSection(JumpTableTextSection, 0);
+ SwitchToTextSection(TAI->getJumpTableTextSection(), 0);
} else {
- SwitchToDataSection(JumpTableDataSection, 0);
+ SwitchToDataSection(TAI->getJumpTableDataSection(), 0);
if (TD->getPointerSize() == 8)
- JTEntryDirective = Data64bitsDirective;
+ JTEntryDirective = TAI->getData64bitsDirective();
}
EmitAlignment(Log2_32(TD->getPointerAlignment()));
@@ -235,13 +202,13 @@
// the number of relocations the assembler will generate for the jump table.
// Set directives are all printed before the jump table itself.
std::set<MachineBasicBlock*> EmittedSets;
- if (SetDirective && TM.getRelocationModel() == Reloc::PIC_)
+ if (TAI->getSetDirective() && TM.getRelocationModel() == Reloc::PIC_)
for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii)
if (EmittedSets.insert(JTBBs[ii]).second)
printSetLabel(i, JTBBs[ii]);
- O << PrivateGlobalPrefix << "JTI" << getFunctionNumber() << '_' << i
- << ":\n";
+ O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
+ << '_' << i << ":\n";
for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) {
O << JTEntryDirective << ' ';
@@ -251,12 +218,12 @@
// If we're emitting non-PIC code, then emit the entries as direct
// references to the target basic blocks.
if (!EmittedSets.empty()) {
- O << PrivateGlobalPrefix << getFunctionNumber() << '_' << i << "_set_"
- << JTBBs[ii]->getNumber();
+ O << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
+ << '_' << i << "_set_" << JTBBs[ii]->getNumber();
} else if (TM.getRelocationModel() == Reloc::PIC_) {
printBasicBlockLabel(JTBBs[ii], false, false);
- O << '-' << PrivateGlobalPrefix << "JTI" << getFunctionNumber()
- << '_' << i;
+ O << '-' << TAI->getPrivateGlobalPrefix() << "JTI"
+ << getFunctionNumber() << '_' << i;
} else {
printBasicBlockLabel(JTBBs[ii], false, false);
}
@@ -280,14 +247,14 @@
return true; // No need to emit this at all.
if (GV->getName() == "llvm.global_ctors" && GV->use_empty()) {
- SwitchToDataSection(StaticCtorsSection, 0);
+ SwitchToDataSection(TAI->getStaticCtorsSection(), 0);
EmitAlignment(2, 0);
EmitXXStructorList(GV->getInitializer());
return true;
}
if (GV->getName() == "llvm.global_dtors" && GV->use_empty()) {
- SwitchToDataSection(StaticDtorsSection, 0);
+ SwitchToDataSection(TAI->getStaticDtorsSection(), 0);
EmitAlignment(2, 0);
EmitXXStructorList(GV->getInitializer());
return true;
@@ -342,22 +309,22 @@
if (GV && GV->getAlignment())
NumBits = Log2_32(GV->getAlignment());
if (NumBits == 0) return; // No need to emit alignment.
- if (AlignmentIsInBytes) NumBits = 1 << NumBits;
- O << AlignDirective << NumBits << "\n";
+ if (TAI->getAlignmentIsInBytes()) NumBits = 1 << NumBits;
+ O << TAI->getAlignDirective() << NumBits << "\n";
}
/// EmitZeros - Emit a block of zeros.
///
void AsmPrinter::EmitZeros(uint64_t NumZeros) const {
if (NumZeros) {
- if (ZeroDirective) {
- O << ZeroDirective << NumZeros;
- if (ZeroDirectiveSuffix)
- O << ZeroDirectiveSuffix;
+ if (TAI->getZeroDirective()) {
+ O << TAI->getZeroDirective() << NumZeros;
+ if (TAI->getZeroDirectiveSuffix())
+ O << TAI->getZeroDirectiveSuffix();
O << "\n";
} else {
for (; NumZeros; --NumZeros)
- O << Data8bitsDirective << "0\n";
+ O << TAI->getData8bitsDirective() << "0\n";
}
}
}
@@ -382,10 +349,15 @@
// name of the variable or function as the address value, possibly
// decorating it with GlobalVarAddrPrefix/Suffix or
// FunctionAddrPrefix/Suffix (these all default to "" )
- if (isa<Function>(GV))
- O << FunctionAddrPrefix << Mang->getValueName(GV) << FunctionAddrSuffix;
- else
- O << GlobalVarAddrPrefix << Mang->getValueName(GV) << GlobalVarAddrSuffix;
+ if (isa<Function>(GV)) {
+ O << TAI->getFunctionAddrPrefix()
+ << Mang->getValueName(GV)
+ << TAI->getFunctionAddrSuffix();
+ } else {
+ O << TAI->getGlobalVarAddrPrefix()
+ << Mang->getValueName(GV)
+ << TAI->getGlobalVarAddrSuffix();
+ }
} else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
const TargetData *TD = TM.getTargetData();
switch(CE->getOpcode()) {
@@ -495,12 +467,12 @@
///
void AsmPrinter::EmitString(const ConstantArray *CVA) const {
unsigned NumElts = CVA->getNumOperands();
- if (AscizDirective && NumElts &&
+ if (TAI->getAscizDirective() && NumElts &&
cast<ConstantInt>(CVA->getOperand(NumElts-1))->getRawValue() == 0) {
- O << AscizDirective;
+ O << TAI->getAscizDirective();
printAsCString(O, CVA, NumElts-1);
} else {
- O << AsciiDirective;
+ O << TAI->getAsciiDirective();
printAsCString(O, CVA, NumElts);
}
O << "\n";
@@ -550,50 +522,50 @@
// precision...
double Val = CFP->getValue();
if (CFP->getType() == Type::DoubleTy) {
- if (Data64bitsDirective)
- O << Data64bitsDirective << DoubleToBits(Val) << "\t" << CommentString
- << " double value: " << Val << "\n";
+ if (TAI->getData64bitsDirective())
+ O << TAI->getData64bitsDirective() << DoubleToBits(Val) << "\t"
+ << TAI->getCommentString() << " double value: " << Val << "\n";
else if (TD->isBigEndian()) {
- O << Data32bitsDirective << unsigned(DoubleToBits(Val) >> 32)
- << "\t" << CommentString << " double most significant word "
- << Val << "\n";
- O << Data32bitsDirective << unsigned(DoubleToBits(Val))
- << "\t" << CommentString << " double least significant word "
- << Val << "\n";
+ O << TAI->getData32bitsDirective() << unsigned(DoubleToBits(Val) >> 32)
+ << "\t" << TAI->getCommentString()
+ << " double most significant word " << Val << "\n";
+ O << TAI->getData32bitsDirective() << unsigned(DoubleToBits(Val))
+ << "\t" << TAI->getCommentString()
+ << " double least significant word " << Val << "\n";
} else {
- O << Data32bitsDirective << unsigned(DoubleToBits(Val))
- << "\t" << CommentString << " double least significant word " << Val
- << "\n";
- O << Data32bitsDirective << unsigned(DoubleToBits(Val) >> 32)
- << "\t" << CommentString << " double most significant word " << Val
- << "\n";
+ O << TAI->getData32bitsDirective() << unsigned(DoubleToBits(Val))
+ << "\t" << TAI->getCommentString()
+ << " double least significant word " << Val << "\n";
+ O << TAI->getData32bitsDirective() << unsigned(DoubleToBits(Val) >> 32)
+ << "\t" << TAI->getCommentString()
+ << " double most significant word " << Val << "\n";
}
return;
} else {
- O << Data32bitsDirective << FloatToBits(Val) << "\t" << CommentString
- << " float " << Val << "\n";
+ O << TAI->getData32bitsDirective() << FloatToBits(Val)
+ << "\t" << TAI->getCommentString() << " float " << Val << "\n";
return;
}
} else if (CV->getType() == Type::ULongTy || CV->getType() == Type::LongTy) {
if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
uint64_t Val = CI->getRawValue();
- if (Data64bitsDirective)
- O << Data64bitsDirective << Val << "\n";
+ if (TAI->getData64bitsDirective())
+ O << TAI->getData64bitsDirective() << Val << "\n";
else if (TD->isBigEndian()) {
- O << Data32bitsDirective << unsigned(Val >> 32)
- << "\t" << CommentString << " Double-word most significant word "
- << Val << "\n";
- O << Data32bitsDirective << unsigned(Val)
- << "\t" << CommentString << " Double-word least significant word "
- << Val << "\n";
+ O << TAI->getData32bitsDirective() << unsigned(Val >> 32)
+ << "\t" << TAI->getCommentString()
+ << " Double-word most significant word " << Val << "\n";
+ O << TAI->getData32bitsDirective() << unsigned(Val)
+ << "\t" << TAI->getCommentString()
+ << " Double-word least significant word " << Val << "\n";
} else {
- O << Data32bitsDirective << unsigned(Val)
- << "\t" << CommentString << " Double-word least significant word "
- << Val << "\n";
- O << Data32bitsDirective << unsigned(Val >> 32)
- << "\t" << CommentString << " Double-word most significant word "
- << Val << "\n";
+ O << TAI->getData32bitsDirective() << unsigned(Val)
+ << "\t" << TAI->getCommentString()
+ << " Double-word least significant word " << Val << "\n";
+ O << TAI->getData32bitsDirective() << unsigned(Val >> 32)
+ << "\t" << TAI->getCommentString()
+ << " Double-word most significant word " << Val << "\n";
}
return;
}
@@ -610,25 +582,26 @@
switch (type->getTypeID()) {
case Type::BoolTyID:
case Type::UByteTyID: case Type::SByteTyID:
- O << Data8bitsDirective;
+ O << TAI->getData8bitsDirective();
break;
case Type::UShortTyID: case Type::ShortTyID:
- O << Data16bitsDirective;
+ O << TAI->getData16bitsDirective();
break;
case Type::PointerTyID:
if (TD->getPointerSize() == 8) {
- assert(Data64bitsDirective &&
+ assert(TAI->getData64bitsDirective() &&
"Target cannot handle 64-bit pointer exprs!");
- O << Data64bitsDirective;
+ O << TAI->getData64bitsDirective();
break;
}
//Fall through for pointer size == int size
case Type::UIntTyID: case Type::IntTyID:
- O << Data32bitsDirective;
+ O << TAI->getData32bitsDirective();
break;
case Type::ULongTyID: case Type::LongTyID:
- assert(Data64bitsDirective &&"Target cannot handle 64-bit constant exprs!");
- O << Data64bitsDirective;
+ assert(TAI->getData64bitsDirective() &&
+ "Target cannot handle 64-bit constant exprs!");
+ O << TAI->getData64bitsDirective();
break;
case Type::FloatTyID: case Type::DoubleTyID:
assert (0 && "Should have already output floating point constant.");
@@ -662,7 +635,7 @@
return;
}
- O << InlineAsmStart << "\n\t";
+ O << TAI->getInlineAsmStart() << "\n\t";
// The variant of the current asmprinter: FIXME: change.
int AsmPrinterVariant = 0;
@@ -810,7 +783,7 @@
break;
}
}
- O << "\n\t" << InlineAsmEnd << "\n";
+ O << "\n\t" << TAI->getInlineAsmEnd() << "\n";
}
/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM
@@ -834,24 +807,24 @@
void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB,
bool printColon,
bool printComment) const {
- O << PrivateGlobalPrefix << "BB" << FunctionNumber << "_"
+ O << TAI->getPrivateGlobalPrefix() << "BB" << FunctionNumber << "_"
<< MBB->getNumber();
if (printColon)
O << ':';
if (printComment)
- O << '\t' << CommentString << MBB->getBasicBlock()->getName();
+ O << '\t' << TAI->getCommentString() << MBB->getBasicBlock()->getName();
}
/// printSetLabel - This method prints a set label for the specified
/// MachineBasicBlock
void AsmPrinter::printSetLabel(unsigned uid,
const MachineBasicBlock *MBB) const {
- if (!SetDirective)
+ if (!TAI->getSetDirective())
return;
- O << SetDirective << ' ' << PrivateGlobalPrefix << getFunctionNumber()
- << '_' << uid << "_set_" << MBB->getNumber() << ',';
+ O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix()
+ << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',';
printBasicBlockLabel(MBB, false, false);
- O << '-' << PrivateGlobalPrefix << "JTI" << getFunctionNumber()
+ O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
<< '_' << uid << '\n';
}
Index: llvm/lib/CodeGen/DwarfWriter.cpp
diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.73 llvm/lib/CodeGen/DwarfWriter.cpp:1.74
--- llvm/lib/CodeGen/DwarfWriter.cpp:1.73 Fri Sep 1 07:55:05 2006
+++ llvm/lib/CodeGen/DwarfWriter.cpp Wed Sep 6 13:34:40 2006
@@ -23,6 +23,7 @@
#include "llvm/Support/Dwarf.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Mangler.h"
+#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/MRegisterInfo.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
@@ -674,7 +675,7 @@
/// SizeOf - Determine size of label value in bytes.
///
unsigned DIEDwarfLabel::SizeOf(const DwarfWriter &DW, unsigned Form) const {
- return DW.getAddressSize();
+ return DW.getTargetAsmInfo()->getAddressSize();
}
//===----------------------------------------------------------------------===//
@@ -688,7 +689,7 @@
/// SizeOf - Determine size of label value in bytes.
///
unsigned DIEObjectLabel::SizeOf(const DwarfWriter &DW, unsigned Form) const {
- return DW.getAddressSize();
+ return DW.getTargetAsmInfo()->getAddressSize();
}
//===----------------------------------------------------------------------===//
@@ -702,7 +703,7 @@
/// SizeOf - Determine size of delta value in bytes.
///
unsigned DIEDelta::SizeOf(const DwarfWriter &DW, unsigned Form) const {
- return DW.getAddressSize();
+ return DW.getTargetAsmInfo()->getAddressSize();
}
//===----------------------------------------------------------------------===//
@@ -957,7 +958,7 @@
void DwarfWriter::EOL(const std::string &Comment) const {
if (DwarfVerbose && !Comment.empty()) {
O << "\t"
- << Asm->CommentString
+ << TAI->getCommentString()
<< " "
<< Comment;
}
@@ -967,17 +968,17 @@
/// EmitAlign - Print a align directive.
///
void DwarfWriter::EmitAlign(unsigned Alignment) const {
- O << Asm->AlignDirective << Alignment << "\n";
+ O << TAI->getAlignDirective() << Alignment << "\n";
}
/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an
/// unsigned leb128 value.
void DwarfWriter::EmitULEB128Bytes(unsigned Value) const {
- if (hasLEB128) {
+ if (TAI->hasLEB128()) {
O << "\t.uleb128\t"
<< Value;
} else {
- O << Asm->Data8bitsDirective;
+ O << TAI->getData8bitsDirective();
PrintULEB128(Value);
}
}
@@ -985,11 +986,11 @@
/// EmitSLEB128Bytes - Emit an assembler byte data directive to compose a
/// signed leb128 value.
void DwarfWriter::EmitSLEB128Bytes(int Value) const {
- if (hasLEB128) {
+ if (TAI->hasLEB128()) {
O << "\t.sleb128\t"
<< Value;
} else {
- O << Asm->Data8bitsDirective;
+ O << TAI->getData8bitsDirective();
PrintSLEB128(Value);
}
}
@@ -1052,29 +1053,29 @@
/// EmitInt8 - Emit a byte directive and value.
///
void DwarfWriter::EmitInt8(int Value) const {
- O << Asm->Data8bitsDirective;
+ O << TAI->getData8bitsDirective();
PrintHex(Value & 0xFF);
}
/// EmitInt16 - Emit a short directive and value.
///
void DwarfWriter::EmitInt16(int Value) const {
- O << Asm->Data16bitsDirective;
+ O << TAI->getData16bitsDirective();
PrintHex(Value & 0xFFFF);
}
/// EmitInt32 - Emit a long directive and value.
///
void DwarfWriter::EmitInt32(int Value) const {
- O << Asm->Data32bitsDirective;
+ O << TAI->getData32bitsDirective();
PrintHex(Value);
}
/// EmitInt64 - Emit a long long directive and value.
///
void DwarfWriter::EmitInt64(uint64_t Value) const {
- if (Asm->Data64bitsDirective) {
- O << Asm->Data64bitsDirective << "0x" << std::hex << Value << std::dec;
+ if (TAI->getData64bitsDirective()) {
+ O << TAI->getData64bitsDirective() << "0x" << std::hex << Value << std::dec;
} else {
if (TD->isBigEndian()) {
EmitInt32(unsigned(Value >> 32)); O << "\n";
@@ -1089,7 +1090,7 @@
/// EmitString - Emit a string with quotes and a null terminator.
/// Special characters are emitted properly. (Eg. '\t')
void DwarfWriter::EmitString(const std::string &String) const {
- O << Asm->AsciiDirective
+ O << TAI->getAsciiDirective()
<< "\"";
for (unsigned i = 0, N = String.size(); i < N; ++i) {
unsigned char C = String[i];
@@ -1122,7 +1123,7 @@
/// PrintLabelName - Print label name in form used by Dwarf writer.
///
void DwarfWriter::PrintLabelName(const char *Tag, unsigned Number) const {
- O << Asm->PrivateGlobalPrefix
+ O << TAI->getPrivateGlobalPrefix()
<< "debug_"
<< Tag;
if (Number) O << Number;
@@ -1138,18 +1139,18 @@
/// EmitReference - Emit a reference to a label.
///
void DwarfWriter::EmitReference(const char *Tag, unsigned Number) const {
- if (AddressSize == 4)
- O << Asm->Data32bitsDirective;
+ if (TAI->getAddressSize() == 4)
+ O << TAI->getData32bitsDirective();
else
- O << Asm->Data64bitsDirective;
+ O << TAI->getData64bitsDirective();
PrintLabelName(Tag, Number);
}
void DwarfWriter::EmitReference(const std::string &Name) const {
- if (AddressSize == 4)
- O << Asm->Data32bitsDirective;
+ if (TAI->getAddressSize() == 4)
+ O << TAI->getData32bitsDirective();
else
- O << Asm->Data64bitsDirective;
+ O << TAI->getData64bitsDirective();
O << Name;
}
@@ -1159,7 +1160,7 @@
/// is an option (needsSet) to use an intermediary 'set' expression.
void DwarfWriter::EmitDifference(const char *TagHi, unsigned NumberHi,
const char *TagLo, unsigned NumberLo) const {
- if (needsSet) {
+ if (TAI->getNeedsSet()) {
static unsigned SetCounter = 0;
O << "\t.set\t";
@@ -1170,19 +1171,19 @@
PrintLabelName(TagLo, NumberLo);
O << "\n";
- if (AddressSize == sizeof(int32_t))
- O << Asm->Data32bitsDirective;
+ if (TAI->getAddressSize() == sizeof(int32_t))
+ O << TAI->getData32bitsDirective();
else
- O << Asm->Data64bitsDirective;
+ O << TAI->getData64bitsDirective();
PrintLabelName("set", SetCounter);
++SetCounter;
} else {
- if (AddressSize == sizeof(int32_t))
- O << Asm->Data32bitsDirective;
+ if (TAI->getAddressSize() == sizeof(int32_t))
+ O << TAI->getData32bitsDirective();
else
- O << Asm->Data64bitsDirective;
+ O << TAI->getData64bitsDirective();
PrintLabelName(TagHi, NumberHi);
O << "-";
@@ -1782,33 +1783,33 @@
didInitial = true;
// Dwarf sections base addresses.
- Asm->SwitchToDataSection(DwarfFrameSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
EmitLabel("section_frame", 0);
- Asm->SwitchToDataSection(DwarfInfoSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfInfoSection(), 0);
EmitLabel("section_info", 0);
EmitLabel("info", 0);
- Asm->SwitchToDataSection(DwarfAbbrevSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection(), 0);
EmitLabel("section_abbrev", 0);
EmitLabel("abbrev", 0);
- Asm->SwitchToDataSection(DwarfARangesSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfARangesSection(), 0);
EmitLabel("section_aranges", 0);
- Asm->SwitchToDataSection(DwarfMacInfoSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection(), 0);
EmitLabel("section_macinfo", 0);
- Asm->SwitchToDataSection(DwarfLineSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfLineSection(), 0);
EmitLabel("section_line", 0);
EmitLabel("line", 0);
- Asm->SwitchToDataSection(DwarfLocSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfLocSection(), 0);
EmitLabel("section_loc", 0);
- Asm->SwitchToDataSection(DwarfPubNamesSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection(), 0);
EmitLabel("section_pubnames", 0);
- Asm->SwitchToDataSection(DwarfStrSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfStrSection(), 0);
EmitLabel("section_str", 0);
- Asm->SwitchToDataSection(DwarfRangesSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfRangesSection(), 0);
EmitLabel("section_ranges", 0);
- Asm->SwitchToTextSection(TextSection, 0);
+ Asm->SwitchToTextSection(TAI->getTextSection(), 0);
EmitLabel("text_begin", 0);
- Asm->SwitchToDataSection(DataSection, 0);
+ Asm->SwitchToDataSection(TAI->getDataSection(), 0);
EmitLabel("data_begin", 0);
// Emit common frame information.
@@ -1958,7 +1959,7 @@
int stackGrowth =
Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
TargetFrameInfo::StackGrowsUp ?
- AddressSize : -AddressSize;
+ TAI->getAddressSize() : -TAI->getAddressSize();
// If advancing cfa.
if (Dst.isRegister() && Dst.getRegister() == MachineLocation::VirtualFP) {
@@ -2013,7 +2014,7 @@
///
void DwarfWriter::EmitDebugInfo() const {
// Start debug info section.
- Asm->SwitchToDataSection(DwarfInfoSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfInfoSection(), 0);
// Process each compile unit.
for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@@ -2033,7 +2034,7 @@
EmitInt16(DWARF_VERSION); EOL("DWARF version number");
EmitDifference("abbrev_begin", 0, "section_abbrev", 0);
EOL("Offset Into Abbrev. Section");
- EmitInt8(AddressSize); EOL("Address Size (in bytes)");
+ EmitInt8(TAI->getAddressSize()); EOL("Address Size (in bytes)");
EmitDIE(Die);
EmitLabel("info_end", Unit->getID());
@@ -2049,7 +2050,7 @@
// Check to see if it is worth the effort.
if (!Abbreviations.empty()) {
// Start the debug abbrev section.
- Asm->SwitchToDataSection(DwarfAbbrevSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection(), 0);
EmitLabel("abbrev_begin", 0);
@@ -2083,7 +2084,7 @@
const int MaxLineDelta = 255 + MinLineDelta;
// Start the dwarf line section.
- Asm->SwitchToDataSection(DwarfLineSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfLineSection(), 0);
// Construct the section header.
@@ -2148,7 +2149,7 @@
if (DwarfVerbose) {
O << "\t"
- << Asm->CommentString << " "
+ << TAI->getCommentString() << " "
<< "Section "
<< SectionMap[j + 1].c_str() << "\n";
}
@@ -2166,7 +2167,7 @@
const SourceFileInfo &SourceFile = SourceFiles[SourceID];
unsigned DirectoryID = SourceFile.getDirectoryID();
O << "\t"
- << Asm->CommentString << " "
+ << TAI->getCommentString() << " "
<< Directories[DirectoryID]
<< SourceFile.getName() << ":"
<< LineInfo->getLine() << "\n";
@@ -2233,10 +2234,10 @@
int stackGrowth =
Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
TargetFrameInfo::StackGrowsUp ?
- AddressSize : -AddressSize;
+ TAI->getAddressSize() : -TAI->getAddressSize();
// Start the dwarf frame section.
- Asm->SwitchToDataSection(DwarfFrameSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
EmitLabel("frame_common", 0);
EmitDifference("frame_common_end", 0,
@@ -2266,7 +2267,7 @@
/// section.
void DwarfWriter::EmitFunctionDebugFrame() {
// Start the dwarf frame section.
- Asm->SwitchToDataSection(DwarfFrameSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0);
EmitDifference("frame_end", SubprogramCount,
"frame_begin", SubprogramCount);
@@ -2296,7 +2297,7 @@
///
void DwarfWriter::EmitDebugPubNames() {
// Start the dwarf pubnames section.
- Asm->SwitchToDataSection(DwarfPubNamesSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection(), 0);
// Process each compile unit.
for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@@ -2343,7 +2344,7 @@
// Check to see if it is worth the effort.
if (!StringPool.empty()) {
// Start the dwarf str section.
- Asm->SwitchToDataSection(DwarfStrSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfStrSection(), 0);
// For each of strings in the string pool.
for (unsigned StringID = 1, N = StringPool.size();
@@ -2363,7 +2364,7 @@
///
void DwarfWriter::EmitDebugLoc() {
// Start the dwarf loc section.
- Asm->SwitchToDataSection(DwarfLocSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfLocSection(), 0);
O << "\n";
}
@@ -2372,7 +2373,7 @@
///
void DwarfWriter::EmitDebugARanges() {
// Start the dwarf aranges section.
- Asm->SwitchToDataSection(DwarfARangesSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfARangesSection(), 0);
// FIXME - Mock up
#if 0
@@ -2389,7 +2390,7 @@
EmitReference("info_begin", Unit->getID());
EOL("Offset of Compilation Unit Info");
- EmitInt8(AddressSize); EOL("Size of Address");
+ EmitInt8(TAI->getAddressSize()); EOL("Size of Address");
EmitInt8(0); EOL("Size of Segment Descriptor");
@@ -2413,7 +2414,7 @@
///
void DwarfWriter::EmitDebugRanges() {
// Start the dwarf ranges section.
- Asm->SwitchToDataSection(DwarfRangesSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfRangesSection(), 0);
O << "\n";
}
@@ -2422,7 +2423,7 @@
///
void DwarfWriter::EmitDebugMacInfo() {
// Start the dwarf macinfo section.
- Asm->SwitchToDataSection(DwarfMacInfoSection, 0);
+ Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection(), 0);
O << "\n";
}
@@ -2466,9 +2467,10 @@
// Main entry points.
//
-DwarfWriter::DwarfWriter(std::ostream &OS, AsmPrinter *A)
+DwarfWriter::DwarfWriter(std::ostream &OS, AsmPrinter *A, TargetAsmInfo *T)
: O(OS)
, Asm(A)
+, TAI(T)
, TD(Asm->TM.getTargetData())
, RI(Asm->TM.getRegisterInfo())
, M(NULL)
@@ -2484,24 +2486,6 @@
, DescToDieMap()
, SectionMap()
, SectionSourceLines()
-, AddressSize(sizeof(int32_t))
-, hasLEB128(false)
-, hasDotLoc(false)
-, hasDotFile(false)
-, needsSet(false)
-, 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")
-, TextSection(".text")
-, DataSection(".data")
{}
DwarfWriter::~DwarfWriter() {
for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@@ -2530,7 +2514,7 @@
ConstructSubprogramDIEs();
// Prime section data.
- SectionMap.insert(std::string("\t") + TextSection);
+ SectionMap.insert(std::string("\t") + TAI->getTextSection());
}
}
@@ -2550,9 +2534,9 @@
EOL("Dwarf End Module");
// Standard sections final addresses.
- Asm->SwitchToTextSection(TextSection, 0);
+ Asm->SwitchToTextSection(TAI->getTextSection(), 0);
EmitLabel("text_end", 0);
- Asm->SwitchToDataSection(DataSection, 0);
+ Asm->SwitchToDataSection(TAI->getDataSection(), 0);
EmitLabel("data_end", 0);
// End text sections.
More information about the llvm-commits
mailing list