diff options
| author | Adrian Prantl <aprantl@apple.com> | 2017-03-22 01:16:01 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2017-03-22 01:16:01 +0000 |
| commit | 0498baa4bea05471f7e683e460e20fd7c5cd6293 (patch) | |
| tree | ad75d3501632f2f2868eff32c9b8ab7168dcec8f /llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp | |
| parent | 80e188d9833ea2dd30a28910a90d966466a56be1 (diff) | |
| download | bcm5719-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.cpp | 9 |
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) { |

