[llvm-commits] CVS: llvm/lib/CodeGen/AsmPrinter.cpp DwarfWriter.cpp
Chris Lattner
lattner at cs.uiuc.edu
Mon May 8 22:00:14 PDT 2006
Changes in directory llvm/lib/CodeGen:
AsmPrinter.cpp updated: 1.68 -> 1.69
DwarfWriter.cpp updated: 1.58 -> 1.59
---
Log message:
Split SwitchSection into SwitchTo{Text|Data}Section methods.
---
Diffs of the changes: (+81 -39)
AsmPrinter.cpp | 70 ++++++++++++++++++++++++++++++++++++++++++++------------
DwarfWriter.cpp | 50 ++++++++++++++++++++--------------------
2 files changed, 81 insertions(+), 39 deletions(-)
Index: llvm/lib/CodeGen/AsmPrinter.cpp
diff -u llvm/lib/CodeGen/AsmPrinter.cpp:1.68 llvm/lib/CodeGen/AsmPrinter.cpp:1.69
--- llvm/lib/CodeGen/AsmPrinter.cpp:1.68 Sat May 6 16:27:14 2006
+++ llvm/lib/CodeGen/AsmPrinter.cpp Mon May 8 23:59:56 2006
@@ -59,10 +59,11 @@
}
-/// SwitchSection - Switch to the specified section of the executable if we
-/// are not already in it!
+/// SwitchToTextSection - Switch to the specified text section of the executable
+/// if we are not already in it!
///
-void AsmPrinter::SwitchSection(const char *NewSection, const GlobalValue *GV) {
+void AsmPrinter::SwitchToTextSection(const char *NewSection,
+ const GlobalValue *GV) {
std::string NS;
// Microsoft ML/MASM has a fundamentally different approach to handling
@@ -78,12 +79,8 @@
return;
}
- bool isData = strcmp(NewSection , ".data") == 0;
-
if (GV && GV->hasSection())
NS = GV->getSection();
- else if (isData)
- NS = "_data";
else
NS = "_text";
@@ -91,8 +88,7 @@
if (!CurrentSection.empty())
O << CurrentSection << "\tends\n\n";
CurrentSection = NS;
- O << CurrentSection << (isData ? "\tsegment 'DATA'\n"
- : "\tsegment 'CODE'\n");
+ O << CurrentSection << "\tsegment 'CODE'\n";
}
} else {
if (GV && GV->hasSection())
@@ -108,6 +104,52 @@
}
}
+/// SwitchToTextSection - Switch to the specified text section of the executable
+/// if we are not already in it!
+///
+void AsmPrinter::SwitchToDataSection(const char *NewSection,
+ const GlobalValue *GV) {
+ std::string NS;
+
+ // Microsoft ML/MASM has a fundamentally different approach to handling
+ // sections.
+
+ if (MLSections) {
+ if (*NewSection == 0) {
+ // Simply end the current section, if any.
+ if (!CurrentSection.empty()) {
+ O << CurrentSection << "\tends\n\n";
+ CurrentSection.clear();
+ }
+ return;
+ }
+
+ if (GV && GV->hasSection())
+ NS = GV->getSection();
+ else
+ NS = "_data";
+
+ if (CurrentSection != NS) {
+ if (!CurrentSection.empty())
+ O << CurrentSection << "\tends\n\n";
+ CurrentSection = NS;
+ O << CurrentSection << "\tsegment 'DATA'\n";
+ }
+ } else {
+ if (GV && GV->hasSection())
+ NS = SwitchToSectionDirective + GV->getSection();
+ else
+ NS = std::string("\t")+NewSection;
+
+ if (CurrentSection != NS) {
+ CurrentSection = NS;
+ if (!CurrentSection.empty())
+ O << CurrentSection << '\n';
+ }
+ }
+}
+
+
bool AsmPrinter::doInitialization(Module &M) {
Mang = new Mangler(M, GlobalPrefix);
@@ -116,7 +158,7 @@
<< M.getModuleInlineAsm()
<< "\n" << CommentString << " End of file scope inline assembly\n";
- SwitchSection("", 0); // Reset back to no section.
+ SwitchToDataSection("", 0); // Reset back to no section.
if (MachineDebugInfo *DebugInfo = getAnalysisToUpdate<MachineDebugInfo>()) {
DebugInfo->AnalyzeModule(M);
@@ -146,7 +188,7 @@
if (CP.empty()) return;
const TargetData *TD = TM.getTargetData();
- SwitchSection(ConstantPoolSection, 0);
+ SwitchToDataSection(ConstantPoolSection, 0);
EmitAlignment(MCP->getConstantPoolAlignment());
for (unsigned i = 0, e = CP.size(); i != e; ++i) {
O << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << '_' << i
@@ -175,7 +217,7 @@
TM.getRelocationModel() == Reloc::DynamicNoPIC) &&
"Unhandled relocation model emitting jump table information!");
- SwitchSection(JumpTableSection, 0);
+ SwitchToDataSection(JumpTableSection, 0);
EmitAlignment(Log2_32(TD->getPointerAlignment()));
for (unsigned i = 0, e = JT.size(); i != e; ++i) {
O << PrivateGlobalPrefix << "JTI" << getFunctionNumber() << '_' << i
@@ -204,14 +246,14 @@
return true; // No need to emit this at all.
if (GV->getName() == "llvm.global_ctors" && GV->use_empty()) {
- SwitchSection(StaticCtorsSection, 0);
+ SwitchToDataSection(StaticCtorsSection, 0);
EmitAlignment(2, 0);
EmitXXStructorList(GV->getInitializer());
return true;
}
if (GV->getName() == "llvm.global_dtors" && GV->use_empty()) {
- SwitchSection(StaticDtorsSection, 0);
+ SwitchToDataSection(StaticDtorsSection, 0);
EmitAlignment(2, 0);
EmitXXStructorList(GV->getInitializer());
return true;
Index: llvm/lib/CodeGen/DwarfWriter.cpp
diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.58 llvm/lib/CodeGen/DwarfWriter.cpp:1.59
--- llvm/lib/CodeGen/DwarfWriter.cpp:1.58 Tue May 2 20:29:56 2006
+++ llvm/lib/CodeGen/DwarfWriter.cpp Mon May 8 23:59:56 2006
@@ -1647,33 +1647,33 @@
///
void DwarfWriter::EmitInitial() const {
// Dwarf sections base addresses.
- Asm->SwitchSection(DwarfFrameSection, 0);
+ Asm->SwitchToDataSection(DwarfFrameSection, 0);
EmitLabel("section_frame", 0);
- Asm->SwitchSection(DwarfInfoSection, 0);
+ Asm->SwitchToDataSection(DwarfInfoSection, 0);
EmitLabel("section_info", 0);
EmitLabel("info", 0);
- Asm->SwitchSection(DwarfAbbrevSection, 0);
+ Asm->SwitchToDataSection(DwarfAbbrevSection, 0);
EmitLabel("section_abbrev", 0);
EmitLabel("abbrev", 0);
- Asm->SwitchSection(DwarfARangesSection, 0);
+ Asm->SwitchToDataSection(DwarfARangesSection, 0);
EmitLabel("section_aranges", 0);
- Asm->SwitchSection(DwarfMacInfoSection, 0);
+ Asm->SwitchToDataSection(DwarfMacInfoSection, 0);
EmitLabel("section_macinfo", 0);
- Asm->SwitchSection(DwarfLineSection, 0);
+ Asm->SwitchToDataSection(DwarfLineSection, 0);
EmitLabel("section_line", 0);
EmitLabel("line", 0);
- Asm->SwitchSection(DwarfLocSection, 0);
+ Asm->SwitchToDataSection(DwarfLocSection, 0);
EmitLabel("section_loc", 0);
- Asm->SwitchSection(DwarfPubNamesSection, 0);
+ Asm->SwitchToDataSection(DwarfPubNamesSection, 0);
EmitLabel("section_pubnames", 0);
- Asm->SwitchSection(DwarfStrSection, 0);
+ Asm->SwitchToDataSection(DwarfStrSection, 0);
EmitLabel("section_str", 0);
- Asm->SwitchSection(DwarfRangesSection, 0);
+ Asm->SwitchToDataSection(DwarfRangesSection, 0);
EmitLabel("section_ranges", 0);
- Asm->SwitchSection(TextSection, 0);
+ Asm->SwitchToDataSection(TextSection, 0);
EmitLabel("text_begin", 0);
- Asm->SwitchSection(DataSection, 0);
+ Asm->SwitchToDataSection(DataSection, 0);
EmitLabel("data_begin", 0);
}
@@ -1849,7 +1849,7 @@
///
void DwarfWriter::EmitDebugInfo() const {
// Start debug info section.
- Asm->SwitchSection(DwarfInfoSection, 0);
+ Asm->SwitchToDataSection(DwarfInfoSection, 0);
// Process each compile unit.
for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@@ -1884,7 +1884,7 @@
// Check to see if it is worth the effort.
if (!Abbreviations.empty()) {
// Start the debug abbrev section.
- Asm->SwitchSection(DwarfAbbrevSection, 0);
+ Asm->SwitchToDataSection(DwarfAbbrevSection, 0);
EmitLabel("abbrev_begin", 0);
@@ -1918,7 +1918,7 @@
const int MaxLineDelta = 255 + MinLineDelta;
// Start the dwarf line section.
- Asm->SwitchSection(DwarfLineSection, 0);
+ Asm->SwitchToDataSection(DwarfLineSection, 0);
// Construct the section header.
@@ -2061,7 +2061,7 @@
AddressSize : -AddressSize;
// Start the dwarf frame section.
- Asm->SwitchSection(DwarfFrameSection, 0);
+ Asm->SwitchToDataSection(DwarfFrameSection, 0);
EmitDifference("frame_common_end", 0,
"frame_common_begin", 0);
@@ -2090,7 +2090,7 @@
/// section.
void DwarfWriter::EmitFunctionDebugFrame() {
// Start the dwarf frame section.
- Asm->SwitchSection(DwarfFrameSection, 0);
+ Asm->SwitchToDataSection(DwarfFrameSection, 0);
EmitDifference("frame_end", SubprogramCount,
"frame_begin", SubprogramCount);
@@ -2119,7 +2119,7 @@
///
void DwarfWriter::EmitDebugPubNames() {
// Start the dwarf pubnames section.
- Asm->SwitchSection(DwarfPubNamesSection, 0);
+ Asm->SwitchToDataSection(DwarfPubNamesSection, 0);
// Process each compile unit.
for (unsigned i = 0, N = CompileUnits.size(); i < N; ++i) {
@@ -2166,7 +2166,7 @@
// Check to see if it is worth the effort.
if (!StringPool.empty()) {
// Start the dwarf str section.
- Asm->SwitchSection(DwarfStrSection, 0);
+ Asm->SwitchToDataSection(DwarfStrSection, 0);
// For each of strings in the string pool.
for (unsigned StringID = 1, N = StringPool.size();
@@ -2186,7 +2186,7 @@
///
void DwarfWriter::EmitDebugLoc() {
// Start the dwarf loc section.
- Asm->SwitchSection(DwarfLocSection, 0);
+ Asm->SwitchToDataSection(DwarfLocSection, 0);
O << "\n";
}
@@ -2195,7 +2195,7 @@
///
void DwarfWriter::EmitDebugARanges() {
// Start the dwarf aranges section.
- Asm->SwitchSection(DwarfARangesSection, 0);
+ Asm->SwitchToDataSection(DwarfARangesSection, 0);
// FIXME - Mock up
#if 0
@@ -2236,7 +2236,7 @@
///
void DwarfWriter::EmitDebugRanges() {
// Start the dwarf ranges section.
- Asm->SwitchSection(DwarfRangesSection, 0);
+ Asm->SwitchToDataSection(DwarfRangesSection, 0);
O << "\n";
}
@@ -2245,7 +2245,7 @@
///
void DwarfWriter::EmitDebugMacInfo() {
// Start the dwarf macinfo section.
- Asm->SwitchSection(DwarfMacInfoSection, 0);
+ Asm->SwitchToDataSection(DwarfMacInfoSection, 0);
O << "\n";
}
@@ -2381,9 +2381,9 @@
EOL("Dwarf End Module");
// Standard sections final addresses.
- Asm->SwitchSection(TextSection, 0);
+ Asm->SwitchToTextSection(TextSection, 0);
EmitLabel("text_end", 0);
- Asm->SwitchSection(DataSection, 0);
+ Asm->SwitchToDataSection(DataSection, 0);
EmitLabel("data_end", 0);
// Compute DIE offsets and sizes.
More information about the llvm-commits
mailing list