Skip to content

Commit 083dc52

Browse files
Put sign information in the opcode instead of as an operand.
1 parent 7dab730 commit 083dc52

File tree

7 files changed

+37
-34
lines changed

7 files changed

+37
-34
lines changed

llvm/docs/LangRef.rst

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6312,13 +6312,15 @@ The current supported opcode vocabulary is limited:
63126312
(``16`` and ``DW_ATE_signed`` here, respectively) to which the top of the
63136313
expression stack is to be converted. Maps into a ``DW_OP_convert`` operation
63146314
that references a base type constructed from the supplied values.
6315-
- ``DW_OP_LLVM_extract_bits, 16, 8, DW_ATE_signed`` specifies the offset, size,
6316-
and encoding (``16``, ``8``, and ``DW_ATE_signed`` here, respectively) of bits
6317-
that are to be extracted from the value at the top of the expression stack.
6318-
If the top of the expression stack is a memory location then these bits are
6319-
extracted from the value pointed to by that memory location. Maps into a
6320-
``DW_OP_shl`` followed by ``DW_OP_shr`` or ``DW_OP_shra`` (depending on
6321-
encoding).
6315+
- ``DW_OP_LLVM_extract_bits_sext, 16, 8,`` specifies the offset and size
6316+
(``16`` and ``8`` here, respectively) of bits that are to be extracted and
6317+
sign-extended from the value at the top of the expression stack. If the top of
6318+
the expression stack is a memory location then these bits are extracted from
6319+
the value pointed to by that memory location. Maps into a ``DW_OP_shl``
6320+
followed by ``DW_OP_shra``.
6321+
- ``DW_OP_LLVM_extract_bits_zext`` behaves similarly to
6322+
``DW_OP_LLVM_extract_bits_sext``, but zero-extends instead of sign-extending.
6323+
Maps into a ``DW_OP_shl`` followed by ``DW_OP_shr``.
63226324
- ``DW_OP_LLVM_tag_offset, tag_offset`` specifies that a memory tag should be
63236325
optionally applied to the pointer. The memory tag is derived from the
63246326
given tag offset in an implementation-defined manner.

llvm/include/llvm/BinaryFormat/Dwarf.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,14 @@ enum LocationAtom {
138138
#include "llvm/BinaryFormat/Dwarf.def"
139139
DW_OP_lo_user = 0xe0,
140140
DW_OP_hi_user = 0xff,
141-
DW_OP_LLVM_fragment = 0x1000, ///< Only used in LLVM metadata.
142-
DW_OP_LLVM_convert = 0x1001, ///< Only used in LLVM metadata.
143-
DW_OP_LLVM_tag_offset = 0x1002, ///< Only used in LLVM metadata.
144-
DW_OP_LLVM_entry_value = 0x1003, ///< Only used in LLVM metadata.
145-
DW_OP_LLVM_implicit_pointer = 0x1004, ///< Only used in LLVM metadata.
146-
DW_OP_LLVM_arg = 0x1005, ///< Only used in LLVM metadata.
147-
DW_OP_LLVM_extract_bits = 0x1006, ///< Only used in LLVM metadata.
141+
DW_OP_LLVM_fragment = 0x1000, ///< Only used in LLVM metadata.
142+
DW_OP_LLVM_convert = 0x1001, ///< Only used in LLVM metadata.
143+
DW_OP_LLVM_tag_offset = 0x1002, ///< Only used in LLVM metadata.
144+
DW_OP_LLVM_entry_value = 0x1003, ///< Only used in LLVM metadata.
145+
DW_OP_LLVM_implicit_pointer = 0x1004, ///< Only used in LLVM metadata.
146+
DW_OP_LLVM_arg = 0x1005, ///< Only used in LLVM metadata.
147+
DW_OP_LLVM_extract_bits_sext = 0x1006, ///< Only used in LLVM metadata.
148+
DW_OP_LLVM_extract_bits_zext = 0x1007, ///< Only used in LLVM metadata.
148149
};
149150

150151
enum LlvmUserLocationAtom {

llvm/lib/BinaryFormat/Dwarf.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,10 @@ StringRef llvm::dwarf::OperationEncodingString(unsigned Encoding) {
155155
return "DW_OP_LLVM_implicit_pointer";
156156
case DW_OP_LLVM_arg:
157157
return "DW_OP_LLVM_arg";
158-
case DW_OP_LLVM_extract_bits:
159-
return "DW_OP_LLVM_extract_bits";
158+
case DW_OP_LLVM_extract_bits_sext:
159+
return "DW_OP_LLVM_extract_bits_sext";
160+
case DW_OP_LLVM_extract_bits_zext:
161+
return "DW_OP_LLVM_extract_bits_zext";
160162
}
161163
}
162164

@@ -171,7 +173,8 @@ unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) {
171173
.Case("DW_OP_LLVM_entry_value", DW_OP_LLVM_entry_value)
172174
.Case("DW_OP_LLVM_implicit_pointer", DW_OP_LLVM_implicit_pointer)
173175
.Case("DW_OP_LLVM_arg", DW_OP_LLVM_arg)
174-
.Case("DW_OP_LLVM_extract_bits", DW_OP_LLVM_extract_bits)
176+
.Case("DW_OP_LLVM_extract_bits_sext", DW_OP_LLVM_extract_bits_sext)
177+
.Case("DW_OP_LLVM_extract_bits_zext", DW_OP_LLVM_extract_bits_zext)
175178
.Default(0);
176179
}
177180

llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -547,10 +547,10 @@ bool DwarfExpression::addExpression(
547547
LocationKind = Unknown;
548548
return true;
549549
}
550-
case dwarf::DW_OP_LLVM_extract_bits: {
550+
case dwarf::DW_OP_LLVM_extract_bits_sext:
551+
case dwarf::DW_OP_LLVM_extract_bits_zext: {
551552
unsigned SizeInBits = Op->getArg(1);
552553
unsigned BitOffset = Op->getArg(0);
553-
dwarf::TypeKind Encoding = static_cast<dwarf::TypeKind>(Op->getArg(2));
554554

555555
// If we have a memory location then dereference to get the value
556556
if (isMemoryLocation())
@@ -570,8 +570,8 @@ bool DwarfExpression::addExpression(
570570
}
571571
emitOp(dwarf::DW_OP_constu);
572572
emitUnsigned(RightShift);
573-
emitOp(Encoding == dwarf::DW_ATE_signed ? dwarf::DW_OP_shra
574-
: dwarf::DW_OP_shr);
573+
emitOp(OpNum == dwarf::DW_OP_LLVM_extract_bits_sext ? dwarf::DW_OP_shra
574+
: dwarf::DW_OP_shr);
575575

576576
// The value is now at the top of the stack, so set the location to
577577
// implicit so that we get a stack_value at the end.

llvm/lib/IR/AsmWriter.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2468,10 +2468,6 @@ static void writeDIExpression(raw_ostream &Out, const DIExpression *N,
24682468
if (Op.getOp() == dwarf::DW_OP_LLVM_convert) {
24692469
Out << FS << Op.getArg(0);
24702470
Out << FS << dwarf::AttributeEncodingString(Op.getArg(1));
2471-
} else if (Op.getOp() == dwarf::DW_OP_LLVM_extract_bits) {
2472-
Out << FS << Op.getArg(0);
2473-
Out << FS << Op.getArg(1);
2474-
Out << FS << dwarf::AttributeEncodingString(Op.getArg(2));
24752471
} else {
24762472
for (unsigned A = 0, AE = Op.getNumArgs(); A != AE; ++A)
24772473
Out << FS << Op.getArg(A);

llvm/lib/IR/DebugInfoMetadata.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,10 +1402,10 @@ unsigned DIExpression::ExprOperand::getSize() const {
14021402
return 2;
14031403

14041404
switch (Op) {
1405-
case dwarf::DW_OP_LLVM_extract_bits:
1406-
return 4;
14071405
case dwarf::DW_OP_LLVM_convert:
14081406
case dwarf::DW_OP_LLVM_fragment:
1407+
case dwarf::DW_OP_LLVM_extract_bits_sext:
1408+
case dwarf::DW_OP_LLVM_extract_bits_zext:
14091409
case dwarf::DW_OP_bregx:
14101410
return 3;
14111411
case dwarf::DW_OP_constu:
@@ -1476,7 +1476,8 @@ bool DIExpression::isValid() const {
14761476
case dwarf::DW_OP_LLVM_convert:
14771477
case dwarf::DW_OP_LLVM_arg:
14781478
case dwarf::DW_OP_LLVM_tag_offset:
1479-
case dwarf::DW_OP_LLVM_extract_bits:
1479+
case dwarf::DW_OP_LLVM_extract_bits_sext:
1480+
case dwarf::DW_OP_LLVM_extract_bits_zext:
14801481
case dwarf::DW_OP_constu:
14811482
case dwarf::DW_OP_plus_uconst:
14821483
case dwarf::DW_OP_plus:

llvm/test/DebugInfo/X86/DW_OP_LLVM_extract_bits.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
define i32 @test1() !dbg !13 {
1818
entry:
1919
%0 = alloca %struct.struct_t, align 1
20-
tail call void @llvm.dbg.declare(metadata ptr %0, metadata !16, metadata !DIExpression(DW_OP_LLVM_extract_bits, 0, 3, DW_ATE_unsigned)), !dbg !17
21-
tail call void @llvm.dbg.declare(metadata ptr %0, metadata !18, metadata !DIExpression(DW_OP_LLVM_extract_bits, 3, 4, DW_ATE_signed)), !dbg !17
20+
tail call void @llvm.dbg.declare(metadata ptr %0, metadata !16, metadata !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 3)), !dbg !17
21+
tail call void @llvm.dbg.declare(metadata ptr %0, metadata !18, metadata !DIExpression(DW_OP_LLVM_extract_bits_sext, 3, 4)), !dbg !17
2222
ret i32 0, !dbg !17
2323
}
2424

@@ -34,8 +34,8 @@ entry:
3434
define i8 @test2() !dbg !20 {
3535
entry:
3636
%0 = load i8, ptr @g, align 1
37-
tail call void @llvm.dbg.value(metadata i8 %0, metadata !21, metadata !DIExpression(DW_OP_LLVM_extract_bits, 0, 3, DW_ATE_unsigned)), !dbg !22
38-
tail call void @llvm.dbg.value(metadata i8 %0, metadata !23, metadata !DIExpression(DW_OP_LLVM_extract_bits, 3, 4, DW_ATE_signed)), !dbg !22
37+
tail call void @llvm.dbg.value(metadata i8 %0, metadata !21, metadata !DIExpression(DW_OP_LLVM_extract_bits_zext, 0, 3)), !dbg !22
38+
tail call void @llvm.dbg.value(metadata i8 %0, metadata !23, metadata !DIExpression(DW_OP_LLVM_extract_bits_sext, 3, 4)), !dbg !22
3939
ret i8 %0, !dbg !22
4040
}
4141

@@ -51,8 +51,8 @@ entry:
5151
define i64 @test3(ptr %p) !dbg !24 {
5252
entry:
5353
%0 = load i64, ptr %p, align 8
54-
tail call void @llvm.dbg.value(metadata i64 %0, metadata !25, metadata !DIExpression(DW_OP_LLVM_extract_bits, 63, 1, DW_ATE_unsigned)), !dbg !26
55-
tail call void @llvm.dbg.value(metadata i64 %0, metadata !27, metadata !DIExpression(DW_OP_LLVM_extract_bits, 63, 1, DW_ATE_signed)), !dbg !26
54+
tail call void @llvm.dbg.value(metadata i64 %0, metadata !25, metadata !DIExpression(DW_OP_LLVM_extract_bits_zext, 63, 1)), !dbg !26
55+
tail call void @llvm.dbg.value(metadata i64 %0, metadata !27, metadata !DIExpression(DW_OP_LLVM_extract_bits_sext, 63, 1)), !dbg !26
5656
ret i64 %0, !dbg !26
5757
}
5858

0 commit comments

Comments
 (0)