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\",@progbits"), - StaticDtorsSection("\t.section .dtors,\"aw\",@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. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits