diff options
Diffstat (limited to 'llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp')
| -rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp index 2244a69bc121..cea0f63bbf81 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp @@ -332,7 +332,7 @@ bool DWARFFormValue::extractValue(const DWARFDataExtractor &Data, break; case DW_FORM_LLVM_addrx_offset: Value.uval = Data.getULEB128(OffsetPtr, &Err) << 32; - Value.uval = Data.getU32(OffsetPtr, &Err); + Value.uval |= Data.getU32(OffsetPtr, &Err); break; case DW_FORM_string: Value.cstr = Data.getCStr(OffsetPtr, &Err); @@ -690,7 +690,7 @@ Optional<uint64_t> DWARFFormValue::getAsReference() const { return R->Unit ? R->Unit->getOffset() + R->Offset : R->Offset; return None; } - + Optional<DWARFFormValue::UnitOffset> DWARFFormValue::getAsRelativeReference() const { if (!isFormClass(FC_Reference)) return None; @@ -762,3 +762,17 @@ Optional<uint64_t> DWARFFormValue::getAsReferenceUVal() const { return None; return Value.uval; } + +Optional<std::string> +DWARFFormValue::getAsFile(DILineInfoSpecifier::FileLineInfoKind Kind) const { + if (U == nullptr || !isFormClass(FC_Constant)) + return None; + DWARFUnit *DLU = const_cast<DWARFUnit *>(U)->getLinkedUnit(); + if (auto *LT = DLU->getContext().getLineTableForUnit(DLU)) { + std::string FileName; + if (LT->getFileNameByIndex(Value.uval, DLU->getCompilationDir(), Kind, + FileName)) + return FileName; + } + return None; +} |
