diff options
| author | Adrian Prantl <aprantl@apple.com> | 2017-04-20 20:42:33 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2017-04-20 20:42:33 +0000 |
| commit | ada104888efce709181b5c82983b331e40015d36 (patch) | |
| tree | 0f7f406cf0f7e35d909d02f600e985d7a94e27be /llvm/lib/CodeGen | |
| parent | 9ed1371adb219b791ac446812182e643c1f727dc (diff) | |
| download | bcm5719-llvm-ada104888efce709181b5c82983b331e40015d36.tar.gz bcm5719-llvm-ada104888efce709181b5c82983b331e40015d36.zip | |
Don't emit locations that need a DW_OP_stack_value in DWARF 2 & 3.
https://bugs.llvm.org/show_bug.cgi?id=32382
llvm-svn: 300883
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h | 2 |
2 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp index 55397c3ac09..f65dc151f30 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp @@ -226,8 +226,15 @@ bool DwarfExpression::addMachineRegExpression(const TargetRegisterInfo &TRI, return true; } - // FIXME: // Don't emit locations that cannot be expressed without DW_OP_stack_value. + if (DwarfVersion < 4) + if (std::any_of(ExprCursor.begin(), ExprCursor.end(), + [](DIExpression::ExprOperand Op) -> bool { + return Op.getOp() == dwarf::DW_OP_stack_value; + })) { + DwarfRegs.clear(); + return false; + } assert(DwarfRegs.size() == 1); auto Reg = DwarfRegs[0]; diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h index 203990dd3c9..de861320006 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h @@ -72,6 +72,8 @@ public: } /// Determine whether there are any operations left in this expression. operator bool() const { return Start != End; } + DIExpression::expr_op_iterator begin() const { return Start; } + DIExpression::expr_op_iterator end() const { return End; } /// Retrieve the fragment information, if any. Optional<DIExpression::FragmentInfo> getFragmentInfo() const { |

