[Lldb-commits] [lldb] 731fee8 - [lldb] Fail evaluation of DWARF expressions with unknown opcodes

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Mon Jun 8 06:52:42 PDT 2020


Author: Pavel Labath
Date: 2020-06-08T15:52:28+02:00
New Revision: 731fee8b420c3877e3574dfd50dc29531f7153af

URL: https://github.com/llvm/llvm-project/commit/731fee8b420c3877e3574dfd50dc29531f7153af
DIFF: https://github.com/llvm/llvm-project/commit/731fee8b420c3877e3574dfd50dc29531f7153af.diff

LOG: [lldb] Fail evaluation of DWARF expressions with unknown opcodes

Previously, we were simply ignoring them and continuing the evaluation.
This behavior does not seem useful, because the resulting value will
most likely be completely bogus.

Added: 
    lldb/test/Shell/SymbolFile/DWARF/DW_TAG_variable-invalid_location.s

Modified: 
    lldb/source/Expression/DWARFExpression.cpp
    lldb/unittests/Expression/DWARFExpressionTest.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index 94b36e8b18bd..3bcadbe9ed4a 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -2535,9 +2535,10 @@ bool DWARFExpression::Evaluate(
     }
 
     default:
-      LLDB_LOGF(log, "Unhandled opcode %s in DWARFExpression.",
-                DW_OP_value_to_name(op));
-      break;
+      if (error_ptr)
+        error_ptr->SetErrorStringWithFormatv(
+            "Unhandled opcode {0} in DWARFExpression", LocationAtom(op));
+      return false;
     }
   }
 

diff  --git a/lldb/test/Shell/SymbolFile/DWARF/DW_TAG_variable-invalid_location.s b/lldb/test/Shell/SymbolFile/DWARF/DW_TAG_variable-invalid_location.s
new file mode 100644
index 000000000000..2295c52f5ead
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/DWARF/DW_TAG_variable-invalid_location.s
@@ -0,0 +1,61 @@
+# RUN: llvm-mc -filetype=obj -o %t -triple x86_64-pc-linux %s
+# RUN: %lldb %t -o "target variable var" -b | FileCheck %s
+
+# CHECK: (lldb) target variable var
+# CHECK: (long) var = <Unhandled opcode DW_OP_unknown_ff in DWARFExpression>
+
+        .section        .debug_abbrev,"", at progbits
+        .byte   1                       # Abbreviation Code
+        .byte   17                      # DW_TAG_compile_unit
+        .byte   1                       # DW_CHILDREN_yes
+        .byte   0                       # EOM(1)
+        .byte   0                       # EOM(2)
+        .byte   2                       # Abbreviation Code
+        .byte   52                      # DW_TAG_variable
+        .byte   0                       # DW_CHILDREN_no
+        .byte   3                       # DW_AT_name
+        .byte   8                       # DW_FORM_string
+        .byte   73                      # DW_AT_type
+        .byte   19                      # DW_FORM_ref4
+        .byte   2                       # DW_AT_location
+        .byte   24                      # DW_FORM_exprloc
+        .byte   0                       # EOM(1)
+        .byte   0                       # EOM(2)
+        .byte   3                       # Abbreviation Code
+        .byte   36                      # DW_TAG_base_type
+        .byte   0                       # DW_CHILDREN_no
+        .byte   3                       # DW_AT_name
+        .byte   8                       # DW_FORM_string
+        .byte   62                      # DW_AT_encoding
+        .byte   11                      # DW_FORM_data1
+        .byte   11                      # DW_AT_byte_size
+        .byte   11                      # DW_FORM_data1
+        .byte   0                       # EOM(1)
+        .byte   0                       # EOM(2)
+        .byte   0                       # EOM(3)
+
+        .section        .debug_info,"", at progbits
+.Lcu_begin0:
+        .long   .Lcu_end-.Lcu_start     # Length of Unit
+.Lcu_start:
+        .short  4                       # DWARF version number
+        .long   .debug_abbrev           # Offset Into Abbrev. Section
+        .byte   8                       # Address Size (in bytes)
+        .byte   1                       # Abbrev [1] 0xb:0x6c DW_TAG_compile_unit
+.Llong:
+        .byte   3                       # Abbrev [3] 0x33:0x7 DW_TAG_base_type
+        .asciz  "long"                  # DW_AT_name
+        .byte   5                       # DW_AT_encoding
+        .byte   8                       # DW_AT_byte_size
+        .byte   2                       # Abbrev [2] 0x3a:0x15 DW_TAG_variable
+        .asciz  "var"                   # DW_AT_name
+        .long   .Llong                  # DW_AT_type
+        .byte   2f-1f                   # DW_AT_location
+1:
+        .byte   0xff                    # Invalid opcode
+        .byte   0xe                     # DW_OP_constu
+        .quad   0xdeadbeefbaadf00d
+        .byte   0x9f                    # DW_OP_stack_value
+2:
+        .byte   0                       # End Of Children Mark
+.Lcu_end:

diff  --git a/lldb/unittests/Expression/DWARFExpressionTest.cpp b/lldb/unittests/Expression/DWARFExpressionTest.cpp
index 4c4281983078..590ac2fa8338 100644
--- a/lldb/unittests/Expression/DWARFExpressionTest.cpp
+++ b/lldb/unittests/Expression/DWARFExpressionTest.cpp
@@ -204,14 +204,14 @@ TEST(DWARFExpression, DW_OP_convert) {
       llvm::HasValue(GetScalar(64, 0xffffffffffeeddcc, is_signed)));
 
   // Truncate to 8 bits.
-  EXPECT_THAT_EXPECTED(t.Eval({DW_OP_const4s, 'A', 'B', 'C', 'D', 0xee, 0xff, //
-                               DW_OP_convert, offs_uchar}),
-                       llvm::HasValue(GetScalar(8, 'A', not_signed)));
+  EXPECT_THAT_EXPECTED(
+      t.Eval({DW_OP_const4s, 'A', 'B', 'C', 'D', DW_OP_convert, offs_uchar}),
+      llvm::HasValue(GetScalar(8, 'A', not_signed)));
 
   // Also truncate to 8 bits.
-  EXPECT_THAT_EXPECTED(t.Eval({DW_OP_const4s, 'A', 'B', 'C', 'D', 0xee, 0xff, //
-                               DW_OP_convert, offs_schar}),
-                       llvm::HasValue(GetScalar(8, 'A', is_signed)));
+  EXPECT_THAT_EXPECTED(
+      t.Eval({DW_OP_const4s, 'A', 'B', 'C', 'D', DW_OP_convert, offs_schar}),
+      llvm::HasValue(GetScalar(8, 'A', is_signed)));
 
   //
   // Errors.
@@ -248,3 +248,10 @@ TEST(DWARFExpression, DW_OP_piece) {
       // represent that yet.
       llvm::HasValue(GetScalar(16, 0xff00, true)));
 }
+
+TEST(DWARFExpression, DW_OP_unknown) {
+  EXPECT_THAT_EXPECTED(
+      Evaluate({0xff}),
+      llvm::FailedWithMessage(
+          "Unhandled opcode DW_OP_unknown_ff in DWARFExpression"));
+}


        


More information about the lldb-commits mailing list