1. Clean up code due to changes in SwitchTo*Section(2)

2. Added partial debug support for mingw\cygwin targets (the same as
   Linux\ELF). Please note, that currently mingw\cygwin uses 'stabs' format
   for storing debug info by default, thus many (runtime) libraries has
   this information included. These formats shouldn't be mixed in one binary
   ('stabs' & 'DWARF'), otherwise binutils tools will be confused.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31311 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anton Korobeynikov 2006-10-31 08:31:24 +00:00
parent d03f1581c8
commit ab4022f196
9 changed files with 80 additions and 52 deletions

View File

@ -96,7 +96,7 @@ bool AsmPrinter::doInitialization(Module &M) {
<< "\n" << TAI->getCommentString() << "\n" << TAI->getCommentString()
<< " End of file scope inline assembly\n"; << " End of file scope inline assembly\n";
SwitchToDataSection("", 0); // Reset back to no section. SwitchToDataSection(""); // Reset back to no section.
if (MachineDebugInfo *DebugInfo = getAnalysisToUpdate<MachineDebugInfo>()) { if (MachineDebugInfo *DebugInfo = getAnalysisToUpdate<MachineDebugInfo>()) {
DebugInfo->AnalyzeModule(M); DebugInfo->AnalyzeModule(M);
@ -160,7 +160,7 @@ void AsmPrinter::EmitConstantPool(unsigned Alignment, const char *Section,
std::vector<std::pair<MachineConstantPoolEntry,unsigned> > &CP) { std::vector<std::pair<MachineConstantPoolEntry,unsigned> > &CP) {
if (CP.empty()) return; if (CP.empty()) return;
SwitchToDataSection(Section, 0); SwitchToDataSection(Section);
EmitAlignment(Alignment); EmitAlignment(Alignment);
for (unsigned i = 0, e = CP.size(); i != e; ++i) { for (unsigned i = 0, e = CP.size(); i != e; ++i) {
O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
@ -203,7 +203,7 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI,
if (TM.getRelocationModel() == Reloc::PIC_) { if (TM.getRelocationModel() == Reloc::PIC_) {
TargetLowering *LoweringInfo = TM.getTargetLowering(); TargetLowering *LoweringInfo = TM.getTargetLowering();
if (LoweringInfo && LoweringInfo->usesGlobalOffsetTable()) { if (LoweringInfo && LoweringInfo->usesGlobalOffsetTable()) {
SwitchToDataSection(TAI->getJumpTableDataSection(), 0); SwitchToDataSection(TAI->getJumpTableDataSection());
if (TD->getPointerSize() == 8 && !JTEntryDirective) if (TD->getPointerSize() == 8 && !JTEntryDirective)
JTEntryDirective = TAI->getData64bitsDirective(); JTEntryDirective = TAI->getData64bitsDirective();
} else { } else {
@ -213,7 +213,7 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI,
SwitchToTextSection(getSectionForFunction(*F).c_str(), F); SwitchToTextSection(getSectionForFunction(*F).c_str(), F);
} }
} else { } else {
SwitchToDataSection(TAI->getJumpTableDataSection(), 0); SwitchToDataSection(TAI->getJumpTableDataSection());
if (TD->getPointerSize() == 8) if (TD->getPointerSize() == 8)
JTEntryDirective = TAI->getData64bitsDirective(); JTEntryDirective = TAI->getData64bitsDirective();
} }
@ -279,14 +279,14 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
} }
if (GV->getName() == "llvm.global_ctors" && GV->use_empty()) { if (GV->getName() == "llvm.global_ctors" && GV->use_empty()) {
SwitchToDataSection(TAI->getStaticCtorsSection(), 0); SwitchToDataSection(TAI->getStaticCtorsSection());
EmitAlignment(2, 0); EmitAlignment(2, 0);
EmitXXStructorList(GV->getInitializer()); EmitXXStructorList(GV->getInitializer());
return true; return true;
} }
if (GV->getName() == "llvm.global_dtors" && GV->use_empty()) { if (GV->getName() == "llvm.global_dtors" && GV->use_empty()) {
SwitchToDataSection(TAI->getStaticDtorsSection(), 0); SwitchToDataSection(TAI->getStaticDtorsSection());
EmitAlignment(2, 0); EmitAlignment(2, 0);
EmitXXStructorList(GV->getInitializer()); EmitXXStructorList(GV->getInitializer());
return true; return true;

View File

@ -2176,30 +2176,30 @@ void Dwarf::EmitInitial() {
// Dwarf sections base addresses. // Dwarf sections base addresses.
if (TAI->getDwarfRequiresFrameSection()) { if (TAI->getDwarfRequiresFrameSection()) {
Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
EmitLabel("section_frame", 0); EmitLabel("section_frame", 0);
} }
Asm->SwitchToDataSection(TAI->getDwarfInfoSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfInfoSection());
EmitLabel("section_info", 0); EmitLabel("section_info", 0);
Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection());
EmitLabel("section_abbrev", 0); EmitLabel("section_abbrev", 0);
Asm->SwitchToDataSection(TAI->getDwarfARangesSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfARangesSection());
EmitLabel("section_aranges", 0); EmitLabel("section_aranges", 0);
Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection());
EmitLabel("section_macinfo", 0); EmitLabel("section_macinfo", 0);
Asm->SwitchToDataSection(TAI->getDwarfLineSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfLineSection());
EmitLabel("section_line", 0); EmitLabel("section_line", 0);
Asm->SwitchToDataSection(TAI->getDwarfLocSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfLocSection());
EmitLabel("section_loc", 0); EmitLabel("section_loc", 0);
Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
EmitLabel("section_pubnames", 0); EmitLabel("section_pubnames", 0);
Asm->SwitchToDataSection(TAI->getDwarfStrSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfStrSection());
EmitLabel("section_str", 0); EmitLabel("section_str", 0);
Asm->SwitchToDataSection(TAI->getDwarfRangesSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
EmitLabel("section_ranges", 0); EmitLabel("section_ranges", 0);
Asm->SwitchToTextSection(TAI->getTextSection(), 0); Asm->SwitchToTextSection(TAI->getTextSection());
EmitLabel("text_begin", 0); EmitLabel("text_begin", 0);
Asm->SwitchToDataSection(TAI->getDataSection(), 0); Asm->SwitchToDataSection(TAI->getDataSection());
EmitLabel("data_begin", 0); EmitLabel("data_begin", 0);
// Emit common frame information. // Emit common frame information.
@ -2408,7 +2408,7 @@ void Dwarf::EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
/// ///
void Dwarf::EmitDebugInfo() const { void Dwarf::EmitDebugInfo() const {
// Start debug info section. // Start debug info section.
Asm->SwitchToDataSection(TAI->getDwarfInfoSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfInfoSection());
// Process each compile unit. // Process each compile unit.
for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) { for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@ -2444,7 +2444,7 @@ void Dwarf::EmitAbbreviations() const {
// Check to see if it is worth the effort. // Check to see if it is worth the effort.
if (!Abbreviations.empty()) { if (!Abbreviations.empty()) {
// Start the debug abbrev section. // Start the debug abbrev section.
Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection());
EmitLabel("abbrev_begin", 0); EmitLabel("abbrev_begin", 0);
@ -2477,7 +2477,7 @@ void Dwarf::EmitDebugLines() const {
const int MaxLineDelta = 255 + MinLineDelta; const int MaxLineDelta = 255 + MinLineDelta;
// Start the dwarf line section. // Start the dwarf line section.
Asm->SwitchToDataSection(TAI->getDwarfLineSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfLineSection());
// Construct the section header. // Construct the section header.
@ -2636,7 +2636,7 @@ void Dwarf::EmitInitialDebugFrame() {
TAI->getAddressSize() : -TAI->getAddressSize(); TAI->getAddressSize() : -TAI->getAddressSize();
// Start the dwarf frame section. // Start the dwarf frame section.
Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
EmitLabel("frame_common", 0); EmitLabel("frame_common", 0);
EmitDifference("frame_common_end", 0, EmitDifference("frame_common_end", 0,
@ -2669,7 +2669,7 @@ void Dwarf::EmitFunctionDebugFrame() {
return; return;
// Start the dwarf frame section. // Start the dwarf frame section.
Asm->SwitchToDataSection(TAI->getDwarfFrameSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
EmitDifference("frame_end", SubprogramCount, EmitDifference("frame_end", SubprogramCount,
"frame_begin", SubprogramCount); "frame_begin", SubprogramCount);
@ -2699,7 +2699,7 @@ void Dwarf::EmitFunctionDebugFrame() {
/// ///
void Dwarf::EmitDebugPubNames() { void Dwarf::EmitDebugPubNames() {
// Start the dwarf pubnames section. // Start the dwarf pubnames section.
Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
// Process each compile unit. // Process each compile unit.
for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) { for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@ -2746,7 +2746,7 @@ void Dwarf::EmitDebugStr() {
// Check to see if it is worth the effort. // Check to see if it is worth the effort.
if (!StringPool.empty()) { if (!StringPool.empty()) {
// Start the dwarf str section. // Start the dwarf str section.
Asm->SwitchToDataSection(TAI->getDwarfStrSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfStrSection());
// For each of strings in the string pool. // For each of strings in the string pool.
for (unsigned StringID = 1, N = StringPool.size(); for (unsigned StringID = 1, N = StringPool.size();
@ -2766,7 +2766,7 @@ void Dwarf::EmitDebugStr() {
/// ///
void Dwarf::EmitDebugLoc() { void Dwarf::EmitDebugLoc() {
// Start the dwarf loc section. // Start the dwarf loc section.
Asm->SwitchToDataSection(TAI->getDwarfLocSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfLocSection());
O << "\n"; O << "\n";
} }
@ -2775,7 +2775,7 @@ void Dwarf::EmitDebugLoc() {
/// ///
void Dwarf::EmitDebugARanges() { void Dwarf::EmitDebugARanges() {
// Start the dwarf aranges section. // Start the dwarf aranges section.
Asm->SwitchToDataSection(TAI->getDwarfARangesSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfARangesSection());
// FIXME - Mock up // FIXME - Mock up
#if 0 #if 0
@ -2816,7 +2816,7 @@ void Dwarf::EmitDebugARanges() {
/// ///
void Dwarf::EmitDebugRanges() { void Dwarf::EmitDebugRanges() {
// Start the dwarf ranges section. // Start the dwarf ranges section.
Asm->SwitchToDataSection(TAI->getDwarfRangesSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
O << "\n"; O << "\n";
} }
@ -2825,7 +2825,7 @@ void Dwarf::EmitDebugRanges() {
/// ///
void Dwarf::EmitDebugMacInfo() { void Dwarf::EmitDebugMacInfo() {
// Start the dwarf macinfo section. // Start the dwarf macinfo section.
Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection(), 0); Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection());
O << "\n"; O << "\n";
} }
@ -2939,14 +2939,14 @@ void Dwarf::EndModule() {
EOL("Dwarf End Module"); EOL("Dwarf End Module");
// Standard sections final addresses. // Standard sections final addresses.
Asm->SwitchToTextSection(TAI->getTextSection(), 0); Asm->SwitchToTextSection(TAI->getTextSection());
EmitLabel("text_end", 0); EmitLabel("text_end", 0);
Asm->SwitchToDataSection(TAI->getDataSection(), 0); Asm->SwitchToDataSection(TAI->getDataSection());
EmitLabel("data_end", 0); EmitLabel("data_end", 0);
// End text sections. // End text sections.
for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) { for (unsigned i = 1, N = SectionMap.size(); i <= N; ++i) {
Asm->SwitchToTextSection(SectionMap[i].c_str(), 0); Asm->SwitchToTextSection(SectionMap[i].c_str());
EmitLabel("section_end", i); EmitLabel("section_end", i);
} }

View File

@ -577,7 +577,7 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
for (std::set<std::string>::iterator i = FnStubs.begin(), e = FnStubs.end(); for (std::set<std::string>::iterator i = FnStubs.begin(), e = FnStubs.end();
i != e; ++i) { i != e; ++i) {
SwitchToTextSection(".section __TEXT,__picsymbolstub1,symbol_stubs," SwitchToTextSection(".section __TEXT,__picsymbolstub1,symbol_stubs,"
"pure_instructions,32", 0); "pure_instructions,32");
EmitAlignment(4); EmitAlignment(4);
O << "L" << *i << "$stub:\n"; O << "L" << *i << "$stub:\n";
O << "\t.indirect_symbol " << *i << "\n"; O << "\t.indirect_symbol " << *i << "\n";
@ -593,7 +593,7 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr-L0$" << *i << ")(r11)\n"; O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr-L0$" << *i << ")(r11)\n";
O << "\tmtctr r12\n"; O << "\tmtctr r12\n";
O << "\tbctr\n"; O << "\tbctr\n";
SwitchToDataSection(".lazy_symbol_pointer", 0); SwitchToDataSection(".lazy_symbol_pointer");
O << "L" << *i << "$lazy_ptr:\n"; O << "L" << *i << "$lazy_ptr:\n";
O << "\t.indirect_symbol " << *i << "\n"; O << "\t.indirect_symbol " << *i << "\n";
if (isPPC64) if (isPPC64)
@ -605,7 +605,7 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
for (std::set<std::string>::iterator i = FnStubs.begin(), e = FnStubs.end(); for (std::set<std::string>::iterator i = FnStubs.begin(), e = FnStubs.end();
i != e; ++i) { i != e; ++i) {
SwitchToTextSection(".section __TEXT,__symbol_stub1,symbol_stubs," SwitchToTextSection(".section __TEXT,__symbol_stub1,symbol_stubs,"
"pure_instructions,16", 0); "pure_instructions,16");
EmitAlignment(4); EmitAlignment(4);
O << "L" << *i << "$stub:\n"; O << "L" << *i << "$stub:\n";
O << "\t.indirect_symbol " << *i << "\n"; O << "\t.indirect_symbol " << *i << "\n";
@ -616,7 +616,7 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr)(r11)\n"; O << "\tlwzu r12,lo16(L" << *i << "$lazy_ptr)(r11)\n";
O << "\tmtctr r12\n"; O << "\tmtctr r12\n";
O << "\tbctr\n"; O << "\tbctr\n";
SwitchToDataSection(".lazy_symbol_pointer", 0); SwitchToDataSection(".lazy_symbol_pointer");
O << "L" << *i << "$lazy_ptr:\n"; O << "L" << *i << "$lazy_ptr:\n";
O << "\t.indirect_symbol " << *i << "\n"; O << "\t.indirect_symbol " << *i << "\n";
if (isPPC64) if (isPPC64)
@ -630,7 +630,7 @@ bool DarwinAsmPrinter::doFinalization(Module &M) {
// Output stubs for external and common global variables. // Output stubs for external and common global variables.
if (GVStubs.begin() != GVStubs.end()) { if (GVStubs.begin() != GVStubs.end()) {
SwitchToDataSection(".non_lazy_symbol_pointer", 0); SwitchToDataSection(".non_lazy_symbol_pointer");
for (std::set<std::string>::iterator I = GVStubs.begin(), for (std::set<std::string>::iterator I = GVStubs.begin(),
E = GVStubs.end(); I != E; ++I) { E = GVStubs.end(); I != E; ++I) {
O << "L" << *I << "$non_lazy_ptr:\n"; O << "L" << *I << "$non_lazy_ptr:\n";

View File

@ -52,7 +52,9 @@ std::string X86ATTAsmPrinter::getSectionForFunction(const Function &F) const {
/// method to print assembly for each instruction. /// method to print assembly for each instruction.
/// ///
bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) { bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) { if (Subtarget->isTargetDarwin() ||
Subtarget->isTargetELF() ||
Subtarget->isTargetCygwin()) {
// Let PassManager know we need debug information and relay // Let PassManager know we need debug information and relay
// the MachineDebugInfo address on to DwarfWriter. // the MachineDebugInfo address on to DwarfWriter.
DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>()); DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
@ -111,7 +113,9 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
F->getLinkage() == Function::WeakLinkage)) F->getLinkage() == Function::WeakLinkage))
O << "_llvm$workaround$fake$stub_" << CurrentFnName << ":\n"; O << "_llvm$workaround$fake$stub_" << CurrentFnName << ":\n";
if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) { if (Subtarget->isTargetDarwin() ||
Subtarget->isTargetELF() ||
Subtarget->isTargetCygwin()) {
// Emit pre-function debug information. // Emit pre-function debug information.
DW.BeginFunction(&MF); DW.BeginFunction(&MF);
} }
@ -141,7 +145,9 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
if (TAI->hasDotTypeDotSizeDirective()) if (TAI->hasDotTypeDotSizeDirective())
O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n"; O << "\t.size " << CurrentFnName << ", .-" << CurrentFnName << "\n";
if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) { if (Subtarget->isTargetDarwin() ||
Subtarget->isTargetELF() ||
Subtarget->isTargetCygwin()) {
// Emit post-function debug information. // Emit post-function debug information.
DW.EndFunction(); DW.EndFunction();
} }

View File

@ -116,7 +116,7 @@ bool X86SharedAsmPrinter::doInitialization(Module &M) {
// Emit initial debug information. // Emit initial debug information.
DW.BeginModule(&M); DW.BeginModule(&M);
} else if (Subtarget->isTargetELF()) { } else if (Subtarget->isTargetELF() || Subtarget->isTargetCygwin()) {
// Emit initial debug information. // Emit initial debug information.
DW.BeginModule(&M); DW.BeginModule(&M);
} }
@ -253,7 +253,7 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
// Output linker support code for dllexported globals // Output linker support code for dllexported globals
if (DLLExportedGVs.begin() != DLLExportedGVs.end()) { if (DLLExportedGVs.begin() != DLLExportedGVs.end()) {
SwitchToDataSection(".section .drectve", 0); SwitchToDataSection(".section .drectve");
} }
for (std::set<std::string>::iterator i = DLLExportedGVs.begin(), for (std::set<std::string>::iterator i = DLLExportedGVs.begin(),
@ -263,7 +263,7 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
} }
if (DLLExportedFns.begin() != DLLExportedFns.end()) { if (DLLExportedFns.begin() != DLLExportedFns.end()) {
SwitchToDataSection(".section .drectve", 0); SwitchToDataSection(".section .drectve");
} }
for (std::set<std::string>::iterator i = DLLExportedFns.begin(), for (std::set<std::string>::iterator i = DLLExportedFns.begin(),
@ -273,7 +273,7 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
} }
if (Subtarget->isTargetDarwin()) { if (Subtarget->isTargetDarwin()) {
SwitchToDataSection("", 0); SwitchToDataSection("");
// Output stubs for dynamically-linked functions // Output stubs for dynamically-linked functions
unsigned j = 1; unsigned j = 1;
@ -291,7 +291,7 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
// Output stubs for external and common global variables. // Output stubs for external and common global variables.
if (GVStubs.begin() != GVStubs.end()) if (GVStubs.begin() != GVStubs.end())
SwitchToDataSection( SwitchToDataSection(
".section __IMPORT,__pointers,non_lazy_symbol_pointers", 0); ".section __IMPORT,__pointers,non_lazy_symbol_pointers");
for (std::set<std::string>::iterator i = GVStubs.begin(), e = GVStubs.end(); for (std::set<std::string>::iterator i = GVStubs.begin(), e = GVStubs.end();
i != e; ++i) { i != e; ++i) {
O << "L" << *i << "$non_lazy_ptr:\n"; O << "L" << *i << "$non_lazy_ptr:\n";
@ -308,7 +308,7 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
// linker can safely perform dead code stripping. Since LLVM never // linker can safely perform dead code stripping. Since LLVM never
// generates code that does this, it is always safe to set. // generates code that does this, it is always safe to set.
O << "\t.subsections_via_symbols\n"; O << "\t.subsections_via_symbols\n";
} else if (Subtarget->isTargetELF()) { } else if (Subtarget->isTargetELF() || Subtarget->isTargetCygwin()) {
// Emit final debug information. // Emit final debug information.
DW.EndModule(); DW.EndModule();
} }

View File

@ -67,7 +67,9 @@ struct VISIBILITY_HIDDEN X86SharedAsmPrinter : public AsmPrinter {
void getAnalysisUsage(AnalysisUsage &AU) const { void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll(); AU.setPreservesAll();
if (Subtarget->isTargetDarwin() || Subtarget->isTargetELF()) { if (Subtarget->isTargetDarwin() ||
Subtarget->isTargetELF() ||
Subtarget->isTargetCygwin()) {
AU.addRequired<MachineDebugInfo>(); AU.addRequired<MachineDebugInfo>();
} }
MachineFunctionPass::getAnalysisUsage(AU); MachineFunctionPass::getAnalysisUsage(AU);

View File

@ -219,7 +219,9 @@ X86TargetLowering::X86TargetLowering(TargetMachine &TM)
setOperationAction(ISD::LOCATION, MVT::Other, Expand); setOperationAction(ISD::LOCATION, MVT::Other, Expand);
setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand); setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand);
// FIXME - use subtarget debug flags // FIXME - use subtarget debug flags
if (!Subtarget->isTargetDarwin() && !Subtarget->isTargetELF()) if (!Subtarget->isTargetDarwin() &&
!Subtarget->isTargetELF() &&
!Subtarget->isTargetCygwin())
setOperationAction(ISD::DEBUG_LABEL, MVT::Other, Expand); setOperationAction(ISD::DEBUG_LABEL, MVT::Other, Expand);
// VASTART needs to be custom lowered to use the VarArgsFrameIndex // VASTART needs to be custom lowered to use the VarArgsFrameIndex

View File

@ -393,14 +393,14 @@ bool X86IntelAsmPrinter::doFinalization(Module &M) {
switch (I->getLinkage()) { switch (I->getLinkage()) {
case GlobalValue::LinkOnceLinkage: case GlobalValue::LinkOnceLinkage:
case GlobalValue::WeakLinkage: case GlobalValue::WeakLinkage:
SwitchToDataSection("", 0); SwitchToDataSection("");
O << name << "?\tsegment common 'COMMON'\n"; O << name << "?\tsegment common 'COMMON'\n";
bCustomSegment = true; bCustomSegment = true;
// FIXME: the default alignment is 16 bytes, but 1, 2, 4, and 256 // FIXME: the default alignment is 16 bytes, but 1, 2, 4, and 256
// are also available. // are also available.
break; break;
case GlobalValue::AppendingLinkage: case GlobalValue::AppendingLinkage:
SwitchToDataSection("", 0); SwitchToDataSection("");
O << name << "?\tsegment public 'DATA'\n"; O << name << "?\tsegment public 'DATA'\n";
bCustomSegment = true; bCustomSegment = true;
// FIXME: the default alignment is 16 bytes, but 1, 2, 4, and 256 // FIXME: the default alignment is 16 bytes, but 1, 2, 4, and 256
@ -434,7 +434,7 @@ bool X86IntelAsmPrinter::doFinalization(Module &M) {
// Output linker support code for dllexported globals // Output linker support code for dllexported globals
if ((DLLExportedGVs.begin() != DLLExportedGVs.end()) || if ((DLLExportedGVs.begin() != DLLExportedGVs.end()) ||
(DLLExportedFns.begin() != DLLExportedFns.end())) { (DLLExportedFns.begin() != DLLExportedFns.end())) {
SwitchToDataSection("", 0); SwitchToDataSection("");
O << "; WARNING: The following code is valid only with MASM v8.x and (possible) higher\n" O << "; WARNING: The following code is valid only with MASM v8.x and (possible) higher\n"
<< "; This version of MASM is usually shipped with Microsoft Visual Studio 2005\n" << "; This version of MASM is usually shipped with Microsoft Visual Studio 2005\n"
<< "; or (possible) further versions. Unfortunately, there is no way to support\n" << "; or (possible) further versions. Unfortunately, there is no way to support\n"
@ -461,7 +461,7 @@ bool X86IntelAsmPrinter::doFinalization(Module &M) {
// Bypass X86SharedAsmPrinter::doFinalization(). // Bypass X86SharedAsmPrinter::doFinalization().
AsmPrinter::doFinalization(M); AsmPrinter::doFinalization(M);
SwitchToDataSection("", 0); SwitchToDataSection("");
O << "\tend\n"; O << "\tend\n";
return false; // success return false; // success
} }

View File

@ -90,6 +90,24 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
HasDotTypeDotSizeDirective = false; HasDotTypeDotSizeDirective = false;
StaticCtorsSection = "\t.section .ctors,\"aw\""; StaticCtorsSection = "\t.section .ctors,\"aw\"";
StaticDtorsSection = "\t.section .dtors,\"aw\""; StaticDtorsSection = "\t.section .dtors,\"aw\"";
// Set up DWARF directives
HasLEB128 = true; // Target asm supports leb128 directives (little-endian)
PrivateGlobalPrefix = "L"; // Prefix for private global symbols
DwarfRequiresFrameSection = false;
DwarfAbbrevSection = "\t.section\t.debug_abbrev,\"dr\"";
DwarfInfoSection = "\t.section\t.debug_info,\"dr\"";
DwarfLineSection = "\t.section\t.debug_line,\"dr\"";
DwarfFrameSection = "\t.section\t.debug_frame,\"dr\"";
DwarfPubNamesSection ="\t.section\t.debug_pubnames,\"dr\"";
DwarfPubTypesSection ="\t.section\t.debug_pubtypes,\"dr\"";
DwarfStrSection = "\t.section\t.debug_str,\"dr\"";
DwarfLocSection = "\t.section\t.debug_loc,\"dr\"";
DwarfARangesSection = "\t.section\t.debug_aranges,\"dr\"";
DwarfRangesSection = "\t.section\t.debug_ranges,\"dr\"";
DwarfMacInfoSection = "\t.section\t.debug_macinfo,\"dr\"";
break;
break; break;
case X86Subtarget::isWindows: case X86Subtarget::isWindows:
GlobalPrefix = "_"; GlobalPrefix = "_";