MCPcopy Create free account
hub / github.com/avast/retdec / loadDwarf_subprogram

Method loadDwarf_subprogram

src/debugformat/dwarf.cpp:106–255  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

104}
105
106retdec::common::Function DebugFormat::loadDwarf_subprogram(llvm::DWARFDie die)
107{
108 // Start & end address.
109 //
110 common::Address start, end;
111 if (auto s = llvm::dwarf::toAddress(die.find(llvm::dwarf::DW_AT_low_pc)))
112 {
113 start = s.getValue();
114 }
115 else if (auto s = llvm::dwarf::toUnsigned(die.find(llvm::dwarf::DW_AT_low_pc)))
116 {
117 start = s.getValue();
118 }
119 if (auto e = llvm::dwarf::toAddress(die.find(llvm::dwarf::DW_AT_high_pc)))
120 {
121 end = e.getValue();
122 }
123 else if (auto e = llvm::dwarf::toUnsigned(die.find(llvm::dwarf::DW_AT_high_pc)))
124 {
125 if (start)
126 {
127 end = start + e.getValue();
128 }
129 }
130 if (start.isUndefined() || end.isUndefined() || end <= start)
131 {
132 return retdec::common::Function();
133 }
134
135 // Names
136 //
137 std::string name, linkageName, demangledName;
138 if (auto n = llvm::dwarf::toString(die.find(
139 llvm::dwarf::DW_AT_name)))
140 {
141 name = n.getValue();
142 }
143 auto ln = llvm::dwarf::toString(die.find(llvm::dwarf::DW_AT_linkage_name));
144 if (!ln.hasValue())
145 {
146 ln = llvm::dwarf::toString(die.find(llvm::dwarf::DW_AT_MIPS_linkage_name));
147 }
148 if (ln.hasValue())
149 {
150 linkageName = ln.getValue();
151 auto dn = _demangler->demangleToString(linkageName);
152 demangledName = dn.empty() ? linkageName : dn;
153 }
154 if (name.empty() && linkageName.empty())
155 {
156 return retdec::common::Function();
157 }
158
159 auto* unit = die.getDwarfUnit();
160 auto* lines = unit->getContext().getLineTableForUnit(unit);
161
162 retdec::common::Function dif(linkageName.empty() ? name : linkageName);
163

Callers

nothing calls this directly

Calls 15

getContextMethod · 0.80
setStartEndMethod · 0.80
isThumbSymbolMethod · 0.80
setSourceFileNameMethod · 0.80
setStartLineMethod · 0.80
setEndLineMethod · 0.80
setLlvmIrMethod · 0.80
setIsVariadicMethod · 0.80
FunctionClass · 0.50
toStringFunction · 0.50
getValueMethod · 0.45
isUndefinedMethod · 0.45

Tested by

no test coverage detected