[llvm] r297247 - [DebugInfo] Make legal and emit DW_OP_swap and DW_OP_xderef
Konstantin Zhuravlyov via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 7 16:28:57 PST 2017
Author: kzhuravl
Date: Tue Mar 7 18:28:57 2017
New Revision: 297247
URL: http://llvm.org/viewvc/llvm-project?rev=297247&view=rev
Log:
[DebugInfo] Make legal and emit DW_OP_swap and DW_OP_xderef
Differential Revision: https://reviews.llvm.org/D29672
Added:
llvm/trunk/test/Verifier/diexpression-swap.ll
Modified:
llvm/trunk/docs/LangRef.rst
llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
llvm/trunk/lib/IR/DebugInfoMetadata.cpp
llvm/trunk/test/Assembler/diexpression.ll
Modified: llvm/trunk/docs/LangRef.rst
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.rst?rev=297247&r1=297246&r2=297247&view=diff
==============================================================================
--- llvm/trunk/docs/LangRef.rst (original)
+++ llvm/trunk/docs/LangRef.rst Tue Mar 7 18:28:57 2017
@@ -4377,6 +4377,10 @@ The current supported vocabulary is limi
- ``DW_OP_plus, 93`` adds ``93`` to the working expression.
- ``DW_OP_bit_piece, 16, 8`` specifies the offset and size (``16`` and ``8``
here, respectively) of the variable piece from the working expression.
+- ``DW_OP_swap`` swaps top two stack entries.
+- ``DW_OP_xderef`` provides extended dereference mechanism. The entry at the top
+ of the stack is treated as an address. The second stack entry is treated as an
+ address space identifier.
.. code-block:: text
@@ -4384,6 +4388,7 @@ The current supported vocabulary is limi
!1 = !DIExpression(DW_OP_plus, 3)
!2 = !DIExpression(DW_OP_bit_piece, 3, 7)
!3 = !DIExpression(DW_OP_deref, DW_OP_plus, 3, DW_OP_bit_piece, 3, 7)
+ !4 = !DIExpression(DW_OP_constu, 2, DW_OP_swap, DW_OP_xderef)
DIObjCProperty
""""""""""""""
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp?rev=297247&r1=297246&r2=297247&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp Tue Mar 7 18:28:57 2017
@@ -273,6 +273,12 @@ void DwarfExpression::AddExpression(DIEx
case dwarf::DW_OP_stack_value:
AddStackValue();
break;
+ case dwarf::DW_OP_swap:
+ EmitOp(dwarf::DW_OP_swap);
+ break;
+ case dwarf::DW_OP_xderef:
+ EmitOp(dwarf::DW_OP_xderef);
+ break;
default:
llvm_unreachable("unhandled opcode found in expression");
}
Modified: llvm/trunk/lib/IR/DebugInfoMetadata.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfoMetadata.cpp?rev=297247&r1=297246&r2=297247&view=diff
==============================================================================
--- llvm/trunk/lib/IR/DebugInfoMetadata.cpp (original)
+++ llvm/trunk/lib/IR/DebugInfoMetadata.cpp Tue Mar 7 18:28:57 2017
@@ -612,10 +612,23 @@ bool DIExpression::isValid() const {
return false;
break;
}
+ case dwarf::DW_OP_swap: {
+ // Must be more than one implicit element on the stack.
+
+ // FIXME: A better way to implement this would be to add a local variable
+ // that keeps track of the stack depth and introduce something like a
+ // DW_LLVM_OP_implicit_location as a placeholder for the location this
+ // DIExpression is attached to, or else pass the number of implicit stack
+ // elements into isValid.
+ if (getNumElements() == 1)
+ return false;
+ break;
+ }
case dwarf::DW_OP_constu:
case dwarf::DW_OP_plus:
case dwarf::DW_OP_minus:
case dwarf::DW_OP_deref:
+ case dwarf::DW_OP_xderef:
break;
}
}
Modified: llvm/trunk/test/Assembler/diexpression.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/diexpression.ll?rev=297247&r1=297246&r2=297247&view=diff
==============================================================================
--- llvm/trunk/test/Assembler/diexpression.ll (original)
+++ llvm/trunk/test/Assembler/diexpression.ll Tue Mar 7 18:28:57 2017
@@ -1,16 +1,18 @@
; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s
; RUN: verify-uselistorder %s
-; CHECK: !named = !{!0, !1, !2, !3, !4}
-!named = !{!0, !1, !2, !3, !4}
+; CHECK: !named = !{!0, !1, !2, !3, !4, !5}
+!named = !{!0, !1, !2, !3, !4, !5}
; CHECK: !0 = !DIExpression()
; CHECK-NEXT: !1 = !DIExpression(DW_OP_deref)
; CHECK-NEXT: !2 = !DIExpression(DW_OP_plus, 3)
; CHECK-NEXT: !3 = !DIExpression(DW_OP_LLVM_fragment, 3, 7)
; CHECK-NEXT: !4 = !DIExpression(DW_OP_deref, DW_OP_plus, 3, DW_OP_LLVM_fragment, 3, 7)
+; CHECK-NEXT: !5 = !DIExpression(DW_OP_constu, 2, DW_OP_swap, DW_OP_xderef)
!0 = !DIExpression()
!1 = !DIExpression(DW_OP_deref)
!2 = !DIExpression(DW_OP_plus, 3)
!3 = !DIExpression(DW_OP_LLVM_fragment, 3, 7)
!4 = !DIExpression(DW_OP_deref, DW_OP_plus, 3, DW_OP_LLVM_fragment, 3, 7)
+!5 = !DIExpression(DW_OP_constu, 2, DW_OP_swap, DW_OP_xderef)
Added: llvm/trunk/test/Verifier/diexpression-swap.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/diexpression-swap.ll?rev=297247&view=auto
==============================================================================
--- llvm/trunk/test/Verifier/diexpression-swap.ll (added)
+++ llvm/trunk/test/Verifier/diexpression-swap.ll Tue Mar 7 18:28:57 2017
@@ -0,0 +1,5 @@
+; RUN: not opt -S < %s 2>&1 | FileCheck %s
+
+!named = !{!0}
+; CHECK: invalid expression
+!0 = !DIExpression(DW_OP_swap)
More information about the llvm-commits
mailing list