diff options
author | Dylan McKay <me@dylanmckay.io> | 2019-06-01 09:18:26 +0000 |
---|---|---|
committer | Dylan McKay <me@dylanmckay.io> | 2019-06-01 09:18:26 +0000 |
commit | 038e3b9f57434068f6bfa79cde577813b463d8e6 (patch) | |
tree | eff8744c44e370448a84e3149280b6fd4c554704 /llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp | |
parent | b3498346fd2c98fb09687e83bd645a75105b6a3d (diff) | |
download | bcm5719-llvm-038e3b9f57434068f6bfa79cde577813b463d8e6.tar.gz bcm5719-llvm-038e3b9f57434068f6bfa79cde577813b463d8e6.zip |
Extend the DWARFExpression address handling to support 16-bit addresses
This allows the DWARFExpression class to handle addresses without
crashing on targets with 16-bit pointers like AVR.
This is required in order to generate assembly from clang via the '-S'
flag.
This fixes an error with the following message:
clang: llvm/include/llvm/DebugInfo/DWARF/DWARFExpression.h:132: llvm::DWARFExpression::DWARFExpression(llvm::DataExtractor, uint16_t, uint8_t):
Assertion `AddressSize == 8 || AddressSize == 4' failed.
llvm-svn: 362290
Diffstat (limited to 'llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp b/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp index 133b85a0969..644075011a3 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp @@ -155,17 +155,21 @@ bool DWARFExpression::Operation::extract(DataExtractor Data, uint16_t Version, case Operation::SizeAddr: if (AddressSize == 8) { Operands[Operand] = Data.getU64(&Offset); - } else { - assert(AddressSize == 4); + } else if (AddressSize == 4) { Operands[Operand] = Data.getU32(&Offset); + } else { + assert(AddressSize == 2); + Operands[Operand] = Data.getU16(&Offset); } break; case Operation::SizeRefAddr: if (getRefAddrSize(AddressSize, Version) == 8) { Operands[Operand] = Data.getU64(&Offset); - } else { - assert(getRefAddrSize(AddressSize, Version) == 4); + } else if (getRefAddrSize(AddressSize, Version) == 4) { Operands[Operand] = Data.getU32(&Offset); + } else { + assert(getRefAddrSize(AddressSize, Version) == 2); + Operands[Operand] = Data.getU16(&Offset); } break; case Operation::SizeLEB: |