Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -587,10 +587,12 @@ bool DwarfExpression::addExpression(
emitUnsigned(LeftShift);
emitOp(dwarf::DW_OP_shl);
}
emitOp(dwarf::DW_OP_constu);
emitUnsigned(RightShift);
emitOp(OpNum == dwarf::DW_OP_LLVM_extract_bits_sext ? dwarf::DW_OP_shra
: dwarf::DW_OP_shr);
if (RightShift) {
emitOp(dwarf::DW_OP_constu);
emitUnsigned(RightShift);
emitOp(OpNum == dwarf::DW_OP_LLVM_extract_bits_sext ? dwarf::DW_OP_shra
: dwarf::DW_OP_shr);
}

// The value is now at the top of the stack, so set the location to
// implicit so that we get a stack_value at the end.
Expand Down
5 changes: 5 additions & 0 deletions llvm/test/DebugInfo/X86/DW_OP_LLVM_extract_bits.ll
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,16 @@ entry:
; CHECK: DW_TAG_variable
; CHECK: DW_AT_location (DW_OP_fbreg -4, DW_OP_plus_uconst 0x3, DW_OP_deref_size 0x1, DW_OP_constu 0x38, DW_OP_shl, DW_OP_constu 0x39, DW_OP_shr, DW_OP_stack_value)
; CHECK: DW_AT_name ("z")
; CHECK: DW_AT_location (DW_OP_fbreg -4, DW_OP_deref_size 0x8, DW_OP_stack_value)
; CHECK: DW_AT_name ("q")

define i32 @test4() !dbg !28 {
entry:
%0 = alloca i32, align 4
tail call void @llvm.dbg.declare(metadata ptr %0, metadata !29, metadata !DIExpression(DW_OP_LLVM_extract_bits_zext, 31, 1)), !dbg !30
tail call void @llvm.dbg.declare(metadata ptr %0, metadata !31, metadata !DIExpression(DW_OP_LLVM_extract_bits_sext, 1, 31)), !dbg !30
tail call void @llvm.dbg.declare(metadata ptr %0, metadata !32, metadata !DIExpression(DW_OP_plus_uconst, 3, DW_OP_LLVM_extract_bits_zext, 1, 7)), !dbg !30
tail call void @llvm.dbg.declare(metadata ptr %0, metadata !33, metadata !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 64)), !dbg !30
ret i32 0, !dbg !30
}

Expand Down Expand Up @@ -116,3 +119,5 @@ declare void @llvm.dbg.value(metadata, metadata, metadata)
!30 = !DILocation(line: 0, scope: !28)
!31 = !DILocalVariable(name: "y", scope: !28, file: !3, type: !19)
!32 = !DILocalVariable(name: "z", scope: !28, file: !3, type: !9)
!33 = !DILocalVariable(name: "q", scope: !28, file: !3, type: !34)
!34 = !DIBasicType(name: "uint64_t", size: 64, encoding: DW_ATE_unsigned)