[llvm] r371304 - [DwarfExpression] Disallow some rewrites to avoid undefined behavior

Bjorn Pettersson via llvm-commits llvm-commits at lists.llvm.org
Sat Sep 7 04:40:10 PDT 2019


Author: bjope
Date: Sat Sep  7 04:40:10 2019
New Revision: 371304

URL: http://llvm.org/viewvc/llvm-project?rev=371304&view=rev
Log:
[DwarfExpression] Disallow some rewrites to avoid undefined behavior

Summary:
The value operand in DW_OP_plus_uconst/DW_OP_constu value can be
large (it uses uint64_t as representation internally in LLVM).
This means that in the uint64_t to int conversions, previously done
by DwarfExpression::addMachineRegExpression, could lose information.
Also, the negation done in "-Offset" was undefined behavior in case
Offset was exactly INT_MIN.

To avoid the above problems, we now avoid transformation like
 [Reg, DW_OP_plus_uconst, Offset] --> [DW_OP_breg, Offset]
and
 [Reg, DW_OP_constu, Offset, DW_OP_plus]  --> [DW_OP_breg, Offset]
when Offset > INT_MAX.

And we avoid to transform
 [Reg, DW_OP_constu, Offset, DW_OP_minus] --> [DW_OP_breg,-Offset]
when Offset > INT_MAX+1.

The patch also adjusts DwarfCompileUnit::constructVariableDIEImpl
to make sure that "DW_OP_constu, Offset, DW_OP_minus" is used
instead of "DW_OP_plus_uconst, Offset" when creating DIExpressions
with negative frame index offsets.

Notice that this might just be the tip of the iceberg. There
are lots of fishy handling related to these constants. I think both
DIExpression::appendOffset and DIExpression::extractIfOffset may
trigger undefined behavior for certain values.

Reviewers: sdesmalen, rnk, JDevlieghere

Reviewed By: JDevlieghere

Subscribers: jholewinski, aprantl, hiraditya, ychen, uabelho, llvm-commits

Tags: #debug-info, #llvm

Differential Revision: https://reviews.llvm.org/D67263

Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
    llvm/trunk/test/DebugInfo/NVPTX/dbg-declare-alloca.ll
    llvm/trunk/test/DebugInfo/X86/dw_op_constu.mir

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=371304&r1=371303&r2=371304&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Sat Sep  7 04:40:10 2019
@@ -647,8 +647,7 @@ DIE *DwarfCompileUnit::constructVariable
     int Offset = TFI->getFrameIndexReference(*Asm->MF, Fragment.FI, FrameReg);
     DwarfExpr.addFragmentOffset(Expr);
     SmallVector<uint64_t, 8> Ops;
-    Ops.push_back(dwarf::DW_OP_plus_uconst);
-    Ops.push_back(Offset);
+    DIExpression::appendOffset(Ops, Offset);
     // According to
     // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf
     // cuda-gdb requires DW_AT_address_class for all variables to be able to

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp?rev=371304&r1=371303&r2=371304&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp Sat Sep  7 04:40:10 2019
@@ -280,19 +280,27 @@ bool DwarfExpression::addMachineRegExpre
   // Pattern-match combinations for which more efficient representations exist.
   // [Reg, DW_OP_plus_uconst, Offset] --> [DW_OP_breg, Offset].
   if (Op && (Op->getOp() == dwarf::DW_OP_plus_uconst)) {
-    SignedOffset = Op->getArg(0);
-    ExprCursor.take();
+    uint64_t Offset = Op->getArg(0);
+    uint64_t IntMax = static_cast<uint64_t>(std::numeric_limits<int>::max());
+    if (Offset <= IntMax) {
+      SignedOffset = Offset;
+      ExprCursor.take();
+    }
   }
 
   // [Reg, DW_OP_constu, Offset, DW_OP_plus]  --> [DW_OP_breg, Offset]
   // [Reg, DW_OP_constu, Offset, DW_OP_minus] --> [DW_OP_breg,-Offset]
   // If Reg is a subregister we need to mask it out before subtracting.
   if (Op && Op->getOp() == dwarf::DW_OP_constu) {
+    uint64_t Offset = Op->getArg(0);
+    uint64_t IntMax = static_cast<uint64_t>(std::numeric_limits<int>::max());
     auto N = ExprCursor.peekNext();
-    if (N && (N->getOp() == dwarf::DW_OP_plus ||
-             (N->getOp() == dwarf::DW_OP_minus && !SubRegisterSizeInBits))) {
-      int Offset = Op->getArg(0);
-      SignedOffset = (N->getOp() == dwarf::DW_OP_minus) ? -Offset : Offset;
+    if (N && N->getOp() == dwarf::DW_OP_plus && Offset <= IntMax) {
+      SignedOffset = Offset;
+      ExprCursor.consume(2);
+    } else if (N && N->getOp() == dwarf::DW_OP_minus &&
+               !SubRegisterSizeInBits && Offset <= IntMax + 1) {
+      SignedOffset = -static_cast<int64_t>(Offset);
       ExprCursor.consume(2);
     }
   }

Modified: llvm/trunk/test/DebugInfo/NVPTX/dbg-declare-alloca.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/NVPTX/dbg-declare-alloca.ll?rev=371304&r1=371303&r2=371304&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/NVPTX/dbg-declare-alloca.ll (original)
+++ llvm/trunk/test/DebugInfo/NVPTX/dbg-declare-alloca.ll Sat Sep  7 04:40:10 2019
@@ -125,12 +125,12 @@
 ; CHECK-NEXT: }
 ; CHECK-NEXT: .section .debug_info
 ; CHECK-NEXT: {
-; CHECK-NEXT: .b32 136                             // Length of Unit
+; CHECK-NEXT: .b32 134                             // Length of Unit
 ; CHECK-NEXT: .b8 2                                // DWARF version number
 ; CHECK-NEXT: .b8 0
 ; CHECK-NEXT: .b32 .debug_abbrev                   // Offset Into Abbrev. Section
 ; CHECK-NEXT: .b8 8                                // Address Size (in bytes)
-; CHECK-NEXT: .b8 1                                // Abbrev [1] 0xb:0x81 DW_TAG_compile_unit
+; CHECK-NEXT: .b8 1                                // Abbrev [1] 0xb:0x7f DW_TAG_compile_unit
 ; CHECK-NEXT: .b8 99                               // DW_AT_producer
 ; CHECK-NEXT: .b8 108
 ; CHECK-NEXT: .b8 97
@@ -151,7 +151,7 @@
 ; CHECK-NEXT: .b8 0
 ; CHECK-NEXT: .b64 Lfunc_begin0                    // DW_AT_low_pc
 ; CHECK-NEXT: .b64 Lfunc_end0                      // DW_AT_high_pc
-; CHECK-NEXT: .b8 2                                // Abbrev [2] 0x31:0x3e DW_TAG_subprogram
+; CHECK-NEXT: .b8 2                                // Abbrev [2] 0x31:0x3c DW_TAG_subprogram
 ; CHECK-NEXT: .b64 Lfunc_begin0                    // DW_AT_low_pc
 ; CHECK-NEXT: .b64 Lfunc_end0                      // DW_AT_high_pc
 ; CHECK-NEXT: .b8 1                                // DW_AT_frame_base
@@ -176,20 +176,18 @@
 ; CHECK-NEXT: .b8 3                                // DW_AT_decl_line
 ; CHECK-NEXT: .b8 1                                // DW_AT_prototyped
 ; CHECK-NEXT: .b8 1                                // DW_AT_external
-; CHECK-NEXT: .b8 3                                // Abbrev [3] 0x58:0x16 DW_TAG_variable
+; CHECK-NEXT: .b8 3                                // Abbrev [3] 0x58:0x14 DW_TAG_variable
 ; CHECK-NEXT: .b8 6                                // DW_AT_address_class
-; CHECK-NEXT: .b8 11                               // DW_AT_location
+; CHECK-NEXT: .b8 9                                // DW_AT_location
 ; CHECK-NEXT: .b8 3
 ; CHECK-NEXT: .b64 __local_depot0
-; CHECK-NEXT: .b8 35
-; CHECK-NEXT: .b8 0
 ; CHECK-NEXT: .b8 111                              // DW_AT_name
 ; CHECK-NEXT: .b8 0
 ; CHECK-NEXT: .b8 1                                // DW_AT_decl_file
 ; CHECK-NEXT: .b8 4                                // DW_AT_decl_line
-; CHECK-NEXT: .b32 111                             // DW_AT_type
+; CHECK-NEXT: .b32 109                             // DW_AT_type
 ; CHECK-NEXT: .b8 0                                // End Of Children Mark
-; CHECK-NEXT: .b8 4                                // Abbrev [4] 0x6f:0x15 DW_TAG_structure_type
+; CHECK-NEXT: .b8 4                                // Abbrev [4] 0x6d:0x15 DW_TAG_structure_type
 ; CHECK-NEXT: .b8 70                               // DW_AT_name
 ; CHECK-NEXT: .b8 111
 ; CHECK-NEXT: .b8 111
@@ -197,17 +195,17 @@
 ; CHECK-NEXT: .b8 4                                // DW_AT_byte_size
 ; CHECK-NEXT: .b8 1                                // DW_AT_decl_file
 ; CHECK-NEXT: .b8 1                                // DW_AT_decl_line
-; CHECK-NEXT: .b8 5                                // Abbrev [5] 0x77:0xc DW_TAG_member
+; CHECK-NEXT: .b8 5                                // Abbrev [5] 0x75:0xc DW_TAG_member
 ; CHECK-NEXT: .b8 120                              // DW_AT_name
 ; CHECK-NEXT: .b8 0
-; CHECK-NEXT: .b32 132                             // DW_AT_type
+; CHECK-NEXT: .b32 130                             // DW_AT_type
 ; CHECK-NEXT: .b8 1                                // DW_AT_decl_file
 ; CHECK-NEXT: .b8 1                                // DW_AT_decl_line
 ; CHECK-NEXT: .b8 2                                // DW_AT_data_member_location
 ; CHECK-NEXT: .b8 35
 ; CHECK-NEXT: .b8 0
 ; CHECK-NEXT: .b8 0                                // End Of Children Mark
-; CHECK-NEXT: .b8 6                                // Abbrev [6] 0x84:0x7 DW_TAG_base_type
+; CHECK-NEXT: .b8 6                                // Abbrev [6] 0x82:0x7 DW_TAG_base_type
 ; CHECK-NEXT: .b8 105                              // DW_AT_name
 ; CHECK-NEXT: .b8 110
 ; CHECK-NEXT: .b8 116

Modified: llvm/trunk/test/DebugInfo/X86/dw_op_constu.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/dw_op_constu.mir?rev=371304&r1=371303&r2=371304&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/dw_op_constu.mir (original)
+++ llvm/trunk/test/DebugInfo/X86/dw_op_constu.mir Sat Sep  7 04:40:10 2019
@@ -147,14 +147,28 @@ body:             |
 # CHECK-LABEL: .Ldebug_loc0:
 # CHECK-NEXT:         .quad   .Ltmp0-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp1-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  9                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   1                       # 1
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   16                      # DW_OP_constu
+# CHECK-NEXT:         .byte   255                     # 4294967295
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   15                      #
+# CHECK-NEXT:         .byte   28                      # DW_OP_minus
 # CHECK-NEXT:         .quad   .Ltmp1-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp2-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  9                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
 # CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   16                      # DW_OP_constu
+# CHECK-NEXT:         .byte   128                     # 4294967296
+# CHECK-NEXT:         .byte   128                     #
+# CHECK-NEXT:         .byte   128                     #
+# CHECK-NEXT:         .byte   128                     #
+# CHECK-NEXT:         .byte   16                      #
+# CHECK-NEXT:         .byte   28                      # DW_OP_minus
 # CHECK-NEXT:         .quad   .Ltmp2-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp3-.Lfunc_begin0
 # CHECK-NEXT:         .short  6                       # Loc expr size
@@ -180,25 +194,54 @@ body:             |
 # CHECK-NEXT:         .byte   0                       # 0
 # CHECK-NEXT:         .quad   .Ltmp5-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp6-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  5                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   1                       # 1
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   48                      # DW_OP_lit0
+# CHECK-NEXT:         .byte   32                      # DW_OP_not
+# CHECK-NEXT:         .byte   28                      # DW_OP_minus
 # CHECK-NEXT:         .quad   .Ltmp6-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp7-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  14                      # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   2                       # 2
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   16                      # DW_OP_constu
+# CHECK-NEXT:         .byte   254                     # 18446744073709551614
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   1                       #
+# CHECK-NEXT:         .byte   28                      # DW_OP_minus
 #-----------------------------------------------------------------------
 # CHECK-NEXT:         .quad   .Ltmp8-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp9-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  9                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   127                     # -1
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   16                      # DW_OP_constu
+# CHECK-NEXT:         .byte   255                     # 4294967295
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   15                      #
+# CHECK-NEXT:         .byte   34                      # DW_OP_plus
 # CHECK-NEXT:         .quad   .Ltmp9-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp10-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  9                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
 # CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   16                      # DW_OP_constu
+# CHECK-NEXT:         .byte   128                     # 4294967296
+# CHECK-NEXT:         .byte   128                     #
+# CHECK-NEXT:         .byte   128                     #
+# CHECK-NEXT:         .byte   128                     #
+# CHECK-NEXT:         .byte   16                      #
+# CHECK-NEXT:         .byte   34                      # DW_OP_plus
 # CHECK-NEXT:         .quad   .Ltmp10-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp11-.Lfunc_begin0
 # CHECK-NEXT:         .short  6                       # Loc expr size
@@ -210,13 +253,16 @@ body:             |
 # CHECK-NEXT:         .byte   7                       #
 # CHECK-NEXT:         .quad   .Ltmp11-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp12-.Lfunc_begin0
-# CHECK-NEXT:         .short  6                       # Loc expr size
+# CHECK-NEXT:         .short  9                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   128                     # -2147483648
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   16                      # DW_OP_constu
+# CHECK-NEXT:         .byte   128                     # 2147483648
 # CHECK-NEXT:         .byte   128                     #
 # CHECK-NEXT:         .byte   128                     #
 # CHECK-NEXT:         .byte   128                     #
-# CHECK-NEXT:         .byte   120                     #
+# CHECK-NEXT:         .byte   8                       #
+# CHECK-NEXT:         .byte   34                      # DW_OP_plus
 # CHECK-NEXT:         .quad   .Ltmp12-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp13-.Lfunc_begin0
 # CHECK-NEXT:         .short  2                       # Loc expr size
@@ -224,25 +270,52 @@ body:             |
 # CHECK-NEXT:         .byte   0                       # 0
 # CHECK-NEXT:         .quad   .Ltmp13-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp14-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  5                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   127                     # -1
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   48                      # DW_OP_lit0
+# CHECK-NEXT:         .byte   32                      # DW_OP_not
+# CHECK-NEXT:         .byte   34                      # DW_OP_plus
 # CHECK-NEXT:         .quad   .Ltmp14-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp15-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  14                      # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   126                     # -2
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   16                      # DW_OP_constu
+# CHECK-NEXT:         .byte   254                     # 18446744073709551614
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   1                       #
+# CHECK-NEXT:         .byte   34                      # DW_OP_plus
 #-----------------------------------------------------------------------
 # CHECK-NEXT:         .quad   .Ltmp16-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp17-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  8                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   127                     # -1
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
+# CHECK-NEXT:         .byte   255                     # 4294967295
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   15                      #
 # CHECK-NEXT:         .quad   .Ltmp17-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp18-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  8                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
 # CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
+# CHECK-NEXT:         .byte   128                     # 4294967296
+# CHECK-NEXT:         .byte   128                     #
+# CHECK-NEXT:         .byte   128                     #
+# CHECK-NEXT:         .byte   128                     #
+# CHECK-NEXT:         .byte   16                      #
 # CHECK-NEXT:         .quad   .Ltmp18-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp19-.Lfunc_begin0
 # CHECK-NEXT:         .short  6                       # Loc expr size
@@ -254,13 +327,15 @@ body:             |
 # CHECK-NEXT:         .byte   7                       #
 # CHECK-NEXT:         .quad   .Ltmp19-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp20-.Lfunc_begin0
-# CHECK-NEXT:         .short  6                       # Loc expr size
+# CHECK-NEXT:         .short  8                       # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   128                     # -2147483648
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
+# CHECK-NEXT:         .byte   128                     # 2147483648
 # CHECK-NEXT:         .byte   128                     #
 # CHECK-NEXT:         .byte   128                     #
 # CHECK-NEXT:         .byte   128                     #
-# CHECK-NEXT:         .byte   120                     #
+# CHECK-NEXT:         .byte   8                       #
 # CHECK-NEXT:         .quad   .Ltmp20-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp21-.Lfunc_begin0
 # CHECK-NEXT:         .short  2                       # Loc expr size
@@ -268,13 +343,35 @@ body:             |
 # CHECK-NEXT:         .byte   0                       # 0
 # CHECK-NEXT:         .quad   .Ltmp21-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Ltmp22-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  13                      # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   127                     # -1
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
+# CHECK-NEXT:         .byte   255                     # 18446744073709551615
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   1                       #
 # CHECK-NEXT:         .quad   .Ltmp22-.Lfunc_begin0
 # CHECK-NEXT:         .quad   .Lfunc_end0-.Lfunc_begin0
-# CHECK-NEXT:         .short  2                       # Loc expr size
+# CHECK-NEXT:         .short  13                      # Loc expr size
 # CHECK-NEXT:         .byte   114                     # DW_OP_breg2
-# CHECK-NEXT:         .byte   126                     # -2
+# CHECK-NEXT:         .byte   0                       # 0
+# CHECK-NEXT:         .byte   35                      # DW_OP_plus_uconst
+# CHECK-NEXT:         .byte   254                     # 18446744073709551614
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   255                     #
+# CHECK-NEXT:         .byte   1                       #
 # CHECK-NEXT:         .quad   0
 # CHECK-NEXT:         .quad   0




More information about the llvm-commits mailing list