"llvm/git@repo.hca.bsc.es:rferrer/llvm-epi-0.8.git" did not exist on "520d4adad3a2ce39b362e635574bbdceadcc839d"
Newer
Older
Bill Wendling
committed
EmitLabel("section_macinfo", 0);
}
Bill Wendling
committed
Asm->SwitchToDataSection(TAI->getDwarfLineSection());
EmitLabel("section_line", 0);
Asm->SwitchToDataSection(TAI->getDwarfLocSection());
EmitLabel("section_loc", 0);
Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
EmitLabel("section_pubnames", 0);
Asm->SwitchToDataSection(TAI->getDwarfStrSection());
EmitLabel("section_str", 0);
Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
EmitLabel("section_ranges", 0);
Bill Wendling
committed
Asm->SwitchToSection(TAI->getTextSection());
EmitLabel("text_begin", 0);
Asm->SwitchToSection(TAI->getDataSection());
EmitLabel("data_begin", 0);
Bill Wendling
committed
/// EmitDIE - Recusively Emits a debug information entry.
///
void DwarfDebug::EmitDIE(DIE *Die) {
// Get the abbreviation for this DIE.
unsigned AbbrevNumber = Die->getAbbrevNumber();
const DIEAbbrev *Abbrev = Abbreviations[AbbrevNumber - 1];
Bill Wendling
committed
Asm->EOL();
Bill Wendling
committed
// Emit the code (index) for the abbreviation.
Asm->EmitULEB128Bytes(AbbrevNumber);
Bill Wendling
committed
if (Asm->isVerbose())
Asm->EOL(std::string("Abbrev [" +
utostr(AbbrevNumber) +
"] 0x" + utohexstr(Die->getOffset()) +
":0x" + utohexstr(Die->getSize()) + " " +
dwarf::TagString(Abbrev->getTag())));
else
Asm->EOL();
Bill Wendling
committed
SmallVector<DIEValue*, 32> &Values = Die->getValues();
const SmallVector<DIEAbbrevData, 8> &AbbrevData = Abbrev->getData();
Bill Wendling
committed
// Emit the DIE attribute values.
for (unsigned i = 0, N = Values.size(); i < N; ++i) {
unsigned Attr = AbbrevData[i].getAttribute();
unsigned Form = AbbrevData[i].getForm();
assert(Form && "Too many attributes for DIE (check abbreviation)");
Bill Wendling
committed
switch (Attr) {
case dwarf::DW_AT_sibling:
Asm->EmitInt32(Die->SiblingOffset());
break;
case dwarf::DW_AT_abstract_origin: {
DIEEntry *E = cast<DIEEntry>(Values[i]);
DIE *Origin = E->getEntry();
unsigned Addr =
CompileUnitOffsets[Die->getAbstractCompileUnit()] +
Origin->getOffset();
Bill Wendling
committed
Asm->EmitInt32(Addr);
break;
}
default:
// Emit an attribute using the defined form.
Values[i]->EmitValue(this, Form);
break;
}
Bill Wendling
committed
Asm->EOL(dwarf::AttributeString(Attr));
}
Bill Wendling
committed
// Emit the DIE children if any.
if (Abbrev->getChildrenFlag() == dwarf::DW_CHILDREN_yes) {
const std::vector<DIE *> &Children = Die->getChildren();
Bill Wendling
committed
for (unsigned j = 0, M = Children.size(); j < M; ++j)
EmitDIE(Children[j]);
Bill Wendling
committed
Asm->EmitInt8(0); Asm->EOL("End Of Children Mark");
Bill Wendling
committed
}
Bill Wendling
committed
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
/// EmitDebugInfo / EmitDebugInfoPerCU - Emit the debug info section.
///
void DwarfDebug::EmitDebugInfoPerCU(CompileUnit *Unit) {
DIE *Die = Unit->getDie();
// Emit the compile units header.
EmitLabel("info_begin", Unit->getID());
// Emit size of content not including length itself
unsigned ContentSize = Die->getSize() +
sizeof(int16_t) + // DWARF version number
sizeof(int32_t) + // Offset Into Abbrev. Section
sizeof(int8_t) + // Pointer Size (in bytes)
sizeof(int32_t); // FIXME - extra pad for gdb bug.
Asm->EmitInt32(ContentSize); Asm->EOL("Length of Compilation Unit Info");
Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true, false);
Asm->EOL("Offset Into Abbrev. Section");
Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
EmitDIE(Die);
// FIXME - extra padding for gdb bug.
Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
Asm->EmitInt8(0); Asm->EOL("Extra Pad For GDB");
EmitLabel("info_end", Unit->getID());
Bill Wendling
committed
Asm->EOL();
}
Bill Wendling
committed
void DwarfDebug::EmitDebugInfo() {
// Start debug info section.
Asm->SwitchToDataSection(TAI->getDwarfInfoSection());
Bill Wendling
committed
if (MainCU) {
EmitDebugInfoPerCU(MainCU);
return;
}
Bill Wendling
committed
for (unsigned i = 0, e = CompileUnits.size(); i != e; ++i)
EmitDebugInfoPerCU(CompileUnits[i]);
Bill Wendling
committed
/// EmitAbbreviations - Emit the abbreviation section.
Bill Wendling
committed
void DwarfDebug::EmitAbbreviations() const {
// Check to see if it is worth the effort.
if (!Abbreviations.empty()) {
// Start the debug abbrev section.
Asm->SwitchToDataSection(TAI->getDwarfAbbrevSection());
Bill Wendling
committed
EmitLabel("abbrev_begin", 0);
Bill Wendling
committed
// For each abbrevation.
for (unsigned i = 0, N = Abbreviations.size(); i < N; ++i) {
// Get abbreviation data
const DIEAbbrev *Abbrev = Abbreviations[i];
Bill Wendling
committed
// Emit the abbrevations code (base 1 index.)
Asm->EmitULEB128Bytes(Abbrev->getNumber());
Asm->EOL("Abbreviation Code");
Bill Wendling
committed
// Emit the abbreviations data.
Abbrev->Emit(Asm);
Bill Wendling
committed
Asm->EOL();
}
Bill Wendling
committed
// Mark end of abbreviations.
Asm->EmitULEB128Bytes(0); Asm->EOL("EOM(3)");
Bill Wendling
committed
EmitLabel("abbrev_end", 0);
Asm->EOL();
}
}
Bill Wendling
committed
/// EmitEndOfLineMatrix - Emit the last address of the section and the end of
/// the line matrix.
///
void DwarfDebug::EmitEndOfLineMatrix(unsigned SectionEnd) {
// Define last address of section.
Asm->EmitInt8(0); Asm->EOL("Extended Op");
Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
EmitReference("section_end", SectionEnd); Asm->EOL("Section end label");
Bill Wendling
committed
// Mark end of matrix.
Asm->EmitInt8(0); Asm->EOL("DW_LNE_end_sequence");
Asm->EmitULEB128Bytes(1); Asm->EOL();
Asm->EmitInt8(1); Asm->EOL();
}
Bill Wendling
committed
/// EmitDebugLines - Emit source line information.
///
void DwarfDebug::EmitDebugLines() {
// If the target is using .loc/.file, the assembler will be emitting the
// .debug_line table automatically.
if (TAI->hasDotLocAndDotFile())
return;
Bill Wendling
committed
// Minimum line delta, thus ranging from -10..(255-10).
const int MinLineDelta = -(dwarf::DW_LNS_fixed_advance_pc + 1);
// Maximum line delta, thus ranging from -10..(255-10).
const int MaxLineDelta = 255 + MinLineDelta;
Bill Wendling
committed
// Start the dwarf line section.
Asm->SwitchToDataSection(TAI->getDwarfLineSection());
Bill Wendling
committed
// Construct the section header.
EmitDifference("line_end", 0, "line_begin", 0, true);
Asm->EOL("Length of Source Line Info");
EmitLabel("line_begin", 0);
Bill Wendling
committed
Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF version number");
Bill Wendling
committed
EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0, true);
Asm->EOL("Prolog Length");
EmitLabel("line_prolog_begin", 0);
Bill Wendling
committed
Asm->EmitInt8(1); Asm->EOL("Minimum Instruction Length");
Bill Wendling
committed
Asm->EmitInt8(1); Asm->EOL("Default is_stmt_start flag");
Bill Wendling
committed
Asm->EmitInt8(MinLineDelta); Asm->EOL("Line Base Value (Special Opcodes)");
Bill Wendling
committed
Asm->EmitInt8(MaxLineDelta); Asm->EOL("Line Range Value (Special Opcodes)");
Bill Wendling
committed
Asm->EmitInt8(-MinLineDelta); Asm->EOL("Special Opcode Base");
Bill Wendling
committed
// Line number standard opcode encodings argument count
Asm->EmitInt8(0); Asm->EOL("DW_LNS_copy arg count");
Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_pc arg count");
Asm->EmitInt8(1); Asm->EOL("DW_LNS_advance_line arg count");
Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_file arg count");
Asm->EmitInt8(1); Asm->EOL("DW_LNS_set_column arg count");
Asm->EmitInt8(0); Asm->EOL("DW_LNS_negate_stmt arg count");
Asm->EmitInt8(0); Asm->EOL("DW_LNS_set_basic_block arg count");
Asm->EmitInt8(0); Asm->EOL("DW_LNS_const_add_pc arg count");
Asm->EmitInt8(1); Asm->EOL("DW_LNS_fixed_advance_pc arg count");
Bill Wendling
committed
// Emit directories.
for (unsigned DI = 1, DE = getNumSourceDirectories()+1; DI != DE; ++DI) {
Asm->EmitString(getSourceDirectoryName(DI));
Asm->EOL("Directory");
}
Bill Wendling
committed
Asm->EmitInt8(0); Asm->EOL("End of directories");
// Emit files.
for (unsigned SI = 1, SE = getNumSourceIds()+1; SI != SE; ++SI) {
// Remember source id starts at 1.
std::pair<unsigned, unsigned> Id = getSourceDirectoryAndFileIds(SI);
Asm->EmitString(getSourceFileName(Id.second));
Asm->EOL("Source");
Asm->EmitULEB128Bytes(Id.first);
Asm->EOL("Directory #");
Asm->EmitULEB128Bytes(0);
Asm->EOL("Mod date");
Asm->EmitULEB128Bytes(0);
Asm->EOL("File size");
Bill Wendling
committed
Asm->EmitInt8(0); Asm->EOL("End of files");
Bill Wendling
committed
EmitLabel("line_prolog_end", 0);
Bill Wendling
committed
// A sequence for each text section.
unsigned SecSrcLinesSize = SectionSourceLines.size();
Bill Wendling
committed
for (unsigned j = 0; j < SecSrcLinesSize; ++j) {
// Isolate current sections line info.
const std::vector<SrcLineInfo> &LineInfos = SectionSourceLines[j];
Bill Wendling
committed
if (Asm->isVerbose()) {
const Section* S = SectionMap[j + 1];
O << '\t' << TAI->getCommentString() << " Section"
<< S->getName() << '\n';
} else {
Asm->EOL();
}
Bill Wendling
committed
// Dwarf assumes we start with first line of first source file.
unsigned Source = 1;
unsigned Line = 1;
Bill Wendling
committed
// Construct rows of the address, source, line, column matrix.
for (unsigned i = 0, N = LineInfos.size(); i < N; ++i) {
const SrcLineInfo &LineInfo = LineInfos[i];
unsigned LabelID = MMI->MappedLabel(LineInfo.getLabelID());
if (!LabelID) continue;
if (!Asm->isVerbose())
Asm->EOL();
else {
std::pair<unsigned, unsigned> SourceID =
getSourceDirectoryAndFileIds(LineInfo.getSourceID());
O << '\t' << TAI->getCommentString() << ' '
<< getSourceDirectoryName(SourceID.first) << ' '
<< getSourceFileName(SourceID.second)
<<" :" << utostr_32(LineInfo.getLine()) << '\n';
}
Bill Wendling
committed
// Define the line address.
Asm->EmitInt8(0); Asm->EOL("Extended Op");
Asm->EmitInt8(TD->getPointerSize() + 1); Asm->EOL("Op size");
Asm->EmitInt8(dwarf::DW_LNE_set_address); Asm->EOL("DW_LNE_set_address");
EmitReference("label", LabelID); Asm->EOL("Location label");
Bill Wendling
committed
// If change of source, then switch to the new source.
if (Source != LineInfo.getSourceID()) {
Source = LineInfo.getSourceID();
Asm->EmitInt8(dwarf::DW_LNS_set_file); Asm->EOL("DW_LNS_set_file");
Asm->EmitULEB128Bytes(Source); Asm->EOL("New Source");
}
Bill Wendling
committed
// If change of line.
if (Line != LineInfo.getLine()) {
// Determine offset.
int Offset = LineInfo.getLine() - Line;
int Delta = Offset - MinLineDelta;
Bill Wendling
committed
// Update line.
Line = LineInfo.getLine();
Bill Wendling
committed
// If delta is small enough and in range...
if (Delta >= 0 && Delta < (MaxLineDelta - 1)) {
// ... then use fast opcode.
Asm->EmitInt8(Delta - MinLineDelta); Asm->EOL("Line Delta");
} else {
// ... otherwise use long hand.
Asm->EmitInt8(dwarf::DW_LNS_advance_line);
Asm->EOL("DW_LNS_advance_line");
Asm->EmitSLEB128Bytes(Offset); Asm->EOL("Line Offset");
Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
}
} else {
// Copy the previous row (different address or source)
Asm->EmitInt8(dwarf::DW_LNS_copy); Asm->EOL("DW_LNS_copy");
}
}
Bill Wendling
committed
EmitEndOfLineMatrix(j + 1);
}
Bill Wendling
committed
if (SecSrcLinesSize == 0)
// Because we're emitting a debug_line section, we still need a line
// table. The linker and friends expect it to exist. If there's nothing to
// put into it, emit an empty table.
EmitEndOfLineMatrix(1);
Bill Wendling
committed
EmitLabel("line_end", 0);
Asm->EOL();
Bill Wendling
committed
/// EmitCommonDebugFrame - Emit common frame info into a debug frame section.
///
void DwarfDebug::EmitCommonDebugFrame() {
if (!TAI->doesDwarfRequireFrameSection())
return;
Bill Wendling
committed
int stackGrowth =
Asm->TM.getFrameInfo()->getStackGrowthDirection() ==
TargetFrameInfo::StackGrowsUp ?
TD->getPointerSize() : -TD->getPointerSize();
Bill Wendling
committed
// Start the dwarf frame section.
Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
Bill Wendling
committed
EmitLabel("debug_frame_common", 0);
EmitDifference("debug_frame_common_end", 0,
"debug_frame_common_begin", 0, true);
Asm->EOL("Length of Common Information Entry");
Bill Wendling
committed
EmitLabel("debug_frame_common_begin", 0);
Asm->EmitInt32((int)dwarf::DW_CIE_ID);
Asm->EOL("CIE Identifier Tag");
Asm->EmitInt8(dwarf::DW_CIE_VERSION);
Asm->EOL("CIE Version");
Asm->EmitString("");
Asm->EOL("CIE Augmentation");
Asm->EmitULEB128Bytes(1);
Asm->EOL("CIE Code Alignment Factor");
Asm->EmitSLEB128Bytes(stackGrowth);
Asm->EOL("CIE Data Alignment Factor");
Asm->EmitInt8(RI->getDwarfRegNum(RI->getRARegister(), false));
Asm->EOL("CIE RA Column");
Bill Wendling
committed
std::vector<MachineMove> Moves;
RI->getInitialFrameState(Moves);
Bill Wendling
committed
EmitFrameMoves(NULL, 0, Moves, false);
Bill Wendling
committed
Asm->EmitAlignment(2, 0, 0, false);
EmitLabel("debug_frame_common_end", 0);
Bill Wendling
committed
Asm->EOL();
}
Bill Wendling
committed
/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
/// section.
void
DwarfDebug::EmitFunctionDebugFrame(const FunctionDebugFrameInfo&DebugFrameInfo){
if (!TAI->doesDwarfRequireFrameSection())
return;
Bill Wendling
committed
// Start the dwarf frame section.
Asm->SwitchToDataSection(TAI->getDwarfFrameSection());
Bill Wendling
committed
EmitDifference("debug_frame_end", DebugFrameInfo.Number,
"debug_frame_begin", DebugFrameInfo.Number, true);
Asm->EOL("Length of Frame Information Entry");
Bill Wendling
committed
EmitLabel("debug_frame_begin", DebugFrameInfo.Number);
Bill Wendling
committed
EmitSectionOffset("debug_frame_common", "section_debug_frame",
0, 0, true, false);
Asm->EOL("FDE CIE offset");
Bill Wendling
committed
EmitReference("func_begin", DebugFrameInfo.Number);
Asm->EOL("FDE initial location");
EmitDifference("func_end", DebugFrameInfo.Number,
"func_begin", DebugFrameInfo.Number);
Asm->EOL("FDE address range");
Bill Wendling
committed
EmitFrameMoves("func_begin", DebugFrameInfo.Number, DebugFrameInfo.Moves,
false);
Bill Wendling
committed
Asm->EmitAlignment(2, 0, 0, false);
EmitLabel("debug_frame_end", DebugFrameInfo.Number);
Bill Wendling
committed
Asm->EOL();
}
Bill Wendling
committed
void DwarfDebug::EmitDebugPubNamesPerCU(CompileUnit *Unit) {
EmitDifference("pubnames_end", Unit->getID(),
"pubnames_begin", Unit->getID(), true);
Asm->EOL("Length of Public Names Info");
Bill Wendling
committed
EmitLabel("pubnames_begin", Unit->getID());
Bill Wendling
committed
Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("DWARF Version");
Bill Wendling
committed
EmitSectionOffset("info_begin", "section_info",
Unit->getID(), 0, true, false);
Asm->EOL("Offset of Compilation Unit Info");
Bill Wendling
committed
Bill Wendling
committed
EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),
true);
Asm->EOL("Compilation Unit Length");
Bill Wendling
committed
Bill Wendling
committed
StringMap<DIE*> &Globals = Unit->getGlobals();
for (StringMap<DIE*>::const_iterator
GI = Globals.begin(), GE = Globals.end(); GI != GE; ++GI) {
const char *Name = GI->getKeyData();
DIE * Entity = GI->second;
Asm->EmitInt32(Entity->getOffset()); Asm->EOL("DIE offset");
Asm->EmitString(Name, strlen(Name)); Asm->EOL("External Name");
Bill Wendling
committed
Asm->EmitInt32(0); Asm->EOL("End Mark");
EmitLabel("pubnames_end", Unit->getID());
Bill Wendling
committed
Asm->EOL();
Bill Wendling
committed
/// EmitDebugPubNames - Emit visible names into a debug pubnames section.
///
void DwarfDebug::EmitDebugPubNames() {
// Start the dwarf pubnames section.
Asm->SwitchToDataSection(TAI->getDwarfPubNamesSection());
Bill Wendling
committed
if (MainCU) {
EmitDebugPubNamesPerCU(MainCU);
return;
}
Bill Wendling
committed
for (unsigned i = 0, e = CompileUnits.size(); i != e; ++i)
EmitDebugPubNamesPerCU(CompileUnits[i]);
}
Bill Wendling
committed
/// EmitDebugStr - Emit visible names into a debug str section.
///
void DwarfDebug::EmitDebugStr() {
// Check to see if it is worth the effort.
if (!StringPool.empty()) {
// Start the dwarf str section.
Asm->SwitchToDataSection(TAI->getDwarfStrSection());
Bill Wendling
committed
// For each of strings in the string pool.
for (unsigned StringID = 1, N = StringPool.size();
StringID <= N; ++StringID) {
// Emit a label for reference from debug information entries.
EmitLabel("string", StringID);
Bill Wendling
committed
// Emit the string itself.
const std::string &String = StringPool[StringID];
Asm->EmitString(String); Asm->EOL();
}
Bill Wendling
committed
Asm->EOL();
}
}
Bill Wendling
committed
/// EmitDebugLoc - Emit visible names into a debug loc section.
///
void DwarfDebug::EmitDebugLoc() {
// Start the dwarf loc section.
Asm->SwitchToDataSection(TAI->getDwarfLocSection());
Asm->EOL();
}
Bill Wendling
committed
/// EmitDebugARanges - Emit visible names into a debug aranges section.
///
void DwarfDebug::EmitDebugARanges() {
// Start the dwarf aranges section.
Asm->SwitchToDataSection(TAI->getDwarfARangesSection());
Bill Wendling
committed
// FIXME - Mock up
#if 0
CompileUnit *Unit = GetBaseCompileUnit();
Bill Wendling
committed
// Don't include size of length
Asm->EmitInt32(0x1c); Asm->EOL("Length of Address Ranges Info");
Bill Wendling
committed
Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
Bill Wendling
committed
EmitReference("info_begin", Unit->getID());
Asm->EOL("Offset of Compilation Unit Info");
Bill Wendling
committed
Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Size of Address");
Bill Wendling
committed
Asm->EmitInt8(0); Asm->EOL("Size of Segment Descriptor");
Bill Wendling
committed
Asm->EmitInt16(0); Asm->EOL("Pad (1)");
Asm->EmitInt16(0); Asm->EOL("Pad (2)");
Bill Wendling
committed
// Range 1
EmitReference("text_begin", 0); Asm->EOL("Address");
EmitDifference("text_end", 0, "text_begin", 0, true); Asm->EOL("Length");
Bill Wendling
committed
Asm->EmitInt32(0); Asm->EOL("EOM (1)");
Asm->EmitInt32(0); Asm->EOL("EOM (2)");
#endif
Bill Wendling
committed
Asm->EOL();
Bill Wendling
committed
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
/// EmitDebugRanges - Emit visible names into a debug ranges section.
///
void DwarfDebug::EmitDebugRanges() {
// Start the dwarf ranges section.
Asm->SwitchToDataSection(TAI->getDwarfRangesSection());
Asm->EOL();
}
/// EmitDebugMacInfo - Emit visible names into a debug macinfo section.
///
void DwarfDebug::EmitDebugMacInfo() {
if (TAI->doesSupportMacInfoSection()) {
// Start the dwarf macinfo section.
Asm->SwitchToDataSection(TAI->getDwarfMacInfoSection());
Asm->EOL();
}
}
/// EmitDebugInlineInfo - Emit inline info using following format.
/// Section Header:
/// 1. length of section
/// 2. Dwarf version number
/// 3. address size.
///
/// Entries (one "entry" for each function that was inlined):
///
/// 1. offset into __debug_str section for MIPS linkage name, if exists;
/// otherwise offset into __debug_str for regular function name.
/// 2. offset into __debug_str section for regular function name.
/// 3. an unsigned LEB128 number indicating the number of distinct inlining
/// instances for the function.
///
/// The rest of the entry consists of a {die_offset, low_pc} pair for each
/// inlined instance; the die_offset points to the inlined_subroutine die in the
/// __debug_info section, and the low_pc is the starting address for the
/// inlining instance.
void DwarfDebug::EmitDebugInlineInfo() {
if (!TAI->doesDwarfUsesInlineInfoSection())
Bill Wendling
committed
return;
Bill Wendling
committed
if (!MainCU)
return;
Bill Wendling
committed
Asm->SwitchToDataSection(TAI->getDwarfDebugInlineSection());
Asm->EOL();
EmitDifference("debug_inlined_end", 1,
"debug_inlined_begin", 1, true);
Asm->EOL("Length of Debug Inlined Information Entry");
Bill Wendling
committed
EmitLabel("debug_inlined_begin", 1);
Bill Wendling
committed
Asm->EmitInt16(dwarf::DWARF_VERSION); Asm->EOL("Dwarf Version");
Asm->EmitInt8(TD->getPointerSize()); Asm->EOL("Address Size (in bytes)");
Bill Wendling
committed
for (DenseMap<GlobalVariable *, SmallVector<unsigned, 4> >::iterator
I = InlineInfo.begin(), E = InlineInfo.end(); I != E; ++I) {
GlobalVariable *GV = I->first;
SmallVector<unsigned, 4> &Labels = I->second;
DISubprogram SP(GV);
std::string Name;
std::string LName;
Bill Wendling
committed
SP.getLinkageName(LName);
SP.getName(Name);
Bill Wendling
committed
Asm->EmitString(LName.empty() ? Name : LName);
Asm->EOL("MIPS linkage name");
Bill Wendling
committed
Asm->EmitString(Name); Asm->EOL("Function name");
Bill Wendling
committed
Asm->EmitULEB128Bytes(Labels.size()); Asm->EOL("Inline count");
Bill Wendling
committed
for (SmallVector<unsigned, 4>::iterator LI = Labels.begin(),
LE = Labels.end(); LI != LE; ++LI) {
DIE *SP = MainCU->getDieMapSlotFor(GV);
Asm->EmitInt32(SP->getOffset()); Asm->EOL("DIE offset");
Bill Wendling
committed
if (TD->getPointerSize() == sizeof(int32_t))
O << TAI->getData32bitsDirective();
else
O << TAI->getData64bitsDirective();
Bill Wendling
committed
PrintLabelName("label", *LI); Asm->EOL("low_pc");
}
}
Bill Wendling
committed
EmitLabel("debug_inlined_end", 1);
Asm->EOL();