aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/llvm/DebugInfo/DIContext.h2
-rw-r--r--lib/DebugInfo/DIContext.cpp2
-rw-r--r--lib/DebugInfo/DWARFContext.h8
-rw-r--r--lib/DebugInfo/DWARFFormValue.cpp38
-rw-r--r--tools/llvm-dwarfdump/llvm-dwarfdump.cpp2
5 files changed, 30 insertions, 22 deletions
diff --git a/include/llvm/DebugInfo/DIContext.h b/include/llvm/DebugInfo/DIContext.h
index 26bd1f6..2322341 100644
--- a/include/llvm/DebugInfo/DIContext.h
+++ b/include/llvm/DebugInfo/DIContext.h
@@ -109,7 +109,7 @@ public:
StringRef lineSection = StringRef(),
StringRef stringSection = StringRef(),
StringRef rangeSection = StringRef(),
- const RelocAddrMap &Map = RelocAddrMap());
+ const RelocAddrMap *Map = 0);
virtual void dump(raw_ostream &OS) = 0;
diff --git a/lib/DebugInfo/DIContext.cpp b/lib/DebugInfo/DIContext.cpp
index 691a92c..6484abc 100644
--- a/lib/DebugInfo/DIContext.cpp
+++ b/lib/DebugInfo/DIContext.cpp
@@ -20,7 +20,7 @@ DIContext *DIContext::getDWARFContext(bool isLittleEndian,
StringRef lineSection,
StringRef stringSection,
StringRef rangeSection,
- const RelocAddrMap &Map) {
+ const RelocAddrMap *Map) {
return new DWARFContextInMemory(isLittleEndian, infoSection, abbrevSection,
aRangeSection, lineSection, stringSection,
rangeSection, Map);
diff --git a/lib/DebugInfo/DWARFContext.h b/lib/DebugInfo/DWARFContext.h
index 4001792..d3e9470 100644
--- a/lib/DebugInfo/DWARFContext.h
+++ b/lib/DebugInfo/DWARFContext.h
@@ -26,7 +26,7 @@ namespace llvm {
/// methods that a concrete implementation provides.
class DWARFContext : public DIContext {
bool IsLittleEndian;
- const RelocAddrMap &RelocMap;
+ const RelocAddrMap *RelocMap;
SmallVector<DWARFCompileUnit, 1> CUs;
OwningPtr<DWARFDebugAbbrev> Abbrev;
@@ -39,7 +39,7 @@ class DWARFContext : public DIContext {
/// Read compile units from the debug_info section and store them in CUs.
void parseCompileUnits();
protected:
- DWARFContext(bool isLittleEndian, const RelocAddrMap &Map) :
+ DWARFContext(bool isLittleEndian, const RelocAddrMap *Map) :
IsLittleEndian(isLittleEndian), RelocMap(Map) {}
public:
virtual void dump(raw_ostream &OS);
@@ -73,7 +73,7 @@ public:
DILineInfoSpecifier Specifier = DILineInfoSpecifier());
bool isLittleEndian() const { return IsLittleEndian; }
- const RelocAddrMap &relocMap() const { return RelocMap; }
+ const RelocAddrMap *relocMap() const { return RelocMap; }
virtual StringRef getInfoSection() = 0;
virtual StringRef getAbbrevSection() = 0;
@@ -113,7 +113,7 @@ public:
StringRef lineSection,
StringRef stringSection,
StringRef rangeSection,
- const RelocAddrMap &Map = RelocAddrMap())
+ const RelocAddrMap *Map = 0)
: DWARFContext(isLittleEndian, Map),
InfoSection(infoSection),
AbbrevSection(abbrevSection),
diff --git a/lib/DebugInfo/DWARFFormValue.cpp b/lib/DebugInfo/DWARFFormValue.cpp
index fea9fd7..b75b0c1 100644
--- a/lib/DebugInfo/DWARFFormValue.cpp
+++ b/lib/DebugInfo/DWARFFormValue.cpp
@@ -100,16 +100,20 @@ DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr,
switch (Form) {
case DW_FORM_addr:
case DW_FORM_ref_addr: {
- RelocAddrMap::const_iterator AI
- = cu->getContext().relocMap().find(*offset_ptr);
- if (AI != cu->getContext().relocMap().end()) {
- const std::pair<uint8_t, int64_t> &R = AI->second;
- Value.uval = R.second;
- *offset_ptr += R.first;
- } else
+ bool InRelocMap = false;
+ if (const RelocAddrMap *RelocMap = cu->getContext().relocMap()) {
+ RelocAddrMap::const_iterator AI = RelocMap->find(*offset_ptr);
+ if (AI != RelocMap->end()) {
+ const std::pair<uint8_t, int64_t> &R = AI->second;
+ Value.uval = R.second;
+ *offset_ptr += R.first;
+ InRelocMap = true;
+ }
+ }
+ if (!InRelocMap)
Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize());
- }
break;
+ }
case DW_FORM_exprloc:
case DW_FORM_block:
Value.uval = data.getULEB128(offset_ptr);
@@ -148,13 +152,17 @@ DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr,
Value.sval = data.getSLEB128(offset_ptr);
break;
case DW_FORM_strp: {
- RelocAddrMap::const_iterator AI
- = cu->getContext().relocMap().find(*offset_ptr);
- if (AI != cu->getContext().relocMap().end()) {
- const std::pair<uint8_t, int64_t> &R = AI->second;
- Value.uval = R.second;
- *offset_ptr += R.first;
- } else
+ bool InRelocMap = false;
+ if (const RelocAddrMap *RelocMap = cu->getContext().relocMap()) {
+ RelocAddrMap::const_iterator AI = RelocMap->find(*offset_ptr);
+ if (AI != RelocMap->end()) {
+ const std::pair<uint8_t, int64_t> &R = AI->second;
+ Value.uval = R.second;
+ *offset_ptr += R.first;
+ InRelocMap = true;
+ }
+ }
+ if (!InRelocMap)
Value.uval = data.getU32(offset_ptr);
break;
}
diff --git a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
index e73300a..c0e3491 100644
--- a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
+++ b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
@@ -162,7 +162,7 @@ static void DumpInput(const StringRef &Filename) {
DebugLineSection,
DebugStringSection,
DebugRangesSection,
- RelocMap));
+ &RelocMap));
if (Address == -1ULL) {
outs() << Filename
<< ":\tfile format " << Obj->getFileFormatName() << "\n\n";