diff options
| author | Devang Patel <dpatel@apple.com> | 2009-01-05 23:21:35 +0000 |
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2009-01-05 23:21:35 +0000 |
| commit | 244a64976414f9aef17f1d6c4cdffda503a0894f (patch) | |
| tree | ba0d883c84600782370dd0afd38f5bba965de126 /llvm/lib/CodeGen | |
| parent | 245a73ac16371c003936aab1a58d6fa58e121910 (diff) | |
| download | bcm5719-llvm-244a64976414f9aef17f1d6c4cdffda503a0894f.tar.gz bcm5719-llvm-244a64976414f9aef17f1d6c4cdffda503a0894f.zip | |
Construct subprogram DIEs using DebugInfo.
llvm-svn: 61772
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp index 026671436c0..a2543f9f558 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfWriter.cpp @@ -3214,6 +3214,45 @@ private: } } + /// ConstructSubprograms - Create DIEs for each of the externally visible + /// subprograms. + void ConstructSubprograms() { + + std::string SPName = "llvm.dbg.subprograms"; + std::vector<GlobalVariable*> Result; + getGlobalVariablesUsing(*M, SPName, Result); + for (std::vector<GlobalVariable *>::iterator RI = Result.begin(), + RE = Result.end(); RI != RE; ++RI) { + + DISubprogram *SP = new DISubprogram(*RI); + CompileUnit *Unit = FindCompileUnit(SP->getCompileUnit()); + + // Check for pre-existence. + DIE *&Slot = Unit->getDieMapSlotFor(SP->getGV()); + if (Slot) continue; + + DIE *SubprogramDie = new DIE(DW_TAG_subprogram); + AddString(SubprogramDie, DW_AT_name, DW_FORM_string, SP->getName()); + const std::string &LinkageName = SP->getLinkageName(); + if (!LinkageName.empty()) + AddString(SubprogramDie, DW_AT_MIPS_linkage_name, DW_FORM_string, + LinkageName); + DIType SPTy = SP->getType(); + AddType(Unit, SubprogramDie, SPTy); + if (!SP->isLocalToUnit()) + AddUInt(SubprogramDie, DW_AT_external, DW_FORM_flag, 1); + AddUInt(SubprogramDie, DW_AT_prototyped, DW_FORM_flag, 1); + + AddSourceLine(SubprogramDie, SP); + //Add to map. + Slot = SubprogramDie; + //Add to context owner. + Unit->getDie()->AddChild(SubprogramDie); + //Expose as global. + Unit->AddGlobal(SP->getName(), SubprogramDie); + } + } + /// ConstructSubprogramDIEs - Create DIEs for each of the externally visible /// subprograms. void ConstructSubprogramDIEs() { |

