summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2017-03-22 01:16:01 +0000
committerAdrian Prantl <aprantl@apple.com>2017-03-22 01:16:01 +0000
commit0498baa4bea05471f7e683e460e20fd7c5cd6293 (patch)
treead75d3501632f2f2868eff32c9b8ab7168dcec8f /llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
parent80e188d9833ea2dd30a28910a90d966466a56be1 (diff)
downloadbcm5719-llvm-0498baa4bea05471f7e683e460e20fd7c5cd6293.tar.gz
bcm5719-llvm-0498baa4bea05471f7e683e460e20fd7c5cd6293.zip
Don't compose DWARF expressions with multiple subregisters.
If a register location can only be described by a complex expression (i.e., multiple subregisters) it doesn't safely compose with another complex expression. For example, it is not possible to apply a DW_OP_deref operation to multiple DW_OP_pieces. llvm-svn: 298472
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
index cf199810a0f..88ea4741937 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
@@ -196,6 +196,15 @@ bool DwarfExpression::addMachineRegExpression(const TargetRegisterInfo &TRI,
if (Op && Op->getOp() != dwarf::DW_OP_LLVM_fragment)
HasComplexExpression = true;
+ // If the register can only be described by a complex expression (i.e.,
+ // multiple subregisters) it doesn't safely compose with another complex
+ // expression. For example, it is not possible to apply a DW_OP_deref
+ // operation to multiple DW_OP_pieces.
+ if (HasComplexExpression && DwarfRegs.size() > 1) {
+ DwarfRegs.clear();
+ return false;
+ }
+
// Handle simple register locations.
if (!HasComplexExpression) {
for (auto &Reg : DwarfRegs) {
OpenPOWER on IntegriCloud