Skip to content

Commit 468275d

Browse files
authored
Fix AsmWriter to account for dynamic bit offsets (#146704)
PR #141106 changed the debug metadata to allow dynamic bit offsets and sizes. In that patch, I forgot to update AsmWriter to handle this case. This patch corrects the oversight.
1 parent deba201 commit 468275d

File tree

2 files changed

+44
-42
lines changed

2 files changed

+44
-42
lines changed

llvm/lib/IR/AsmWriter.cpp

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1914,6 +1914,8 @@ struct MDFieldPrinter {
19141914
bool ShouldSkipEmpty = true);
19151915
void printMetadata(StringRef Name, const Metadata *MD,
19161916
bool ShouldSkipNull = true);
1917+
void printMetadataOrInt(StringRef Name, const Metadata *MD, bool IsUnsigned,
1918+
bool ShouldSkipZero = true);
19171919
template <class IntTy>
19181920
void printInt(StringRef Name, IntTy Int, bool ShouldSkipZero = true);
19191921
void printAPInt(StringRef Name, const APInt &Int, bool IsUnsigned,
@@ -1986,6 +1988,21 @@ void MDFieldPrinter::printMetadata(StringRef Name, const Metadata *MD,
19861988
writeMetadataAsOperand(Out, MD, WriterCtx);
19871989
}
19881990

1991+
void MDFieldPrinter::printMetadataOrInt(StringRef Name, const Metadata *MD,
1992+
bool IsUnsigned, bool ShouldSkipZero) {
1993+
if (!MD)
1994+
return;
1995+
1996+
if (auto *CI = dyn_cast<ConstantAsMetadata>(MD)) {
1997+
auto *CV = cast<ConstantInt>(CI->getValue());
1998+
if (IsUnsigned)
1999+
printInt(Name, CV->getZExtValue(), ShouldSkipZero);
2000+
else
2001+
printInt(Name, CV->getSExtValue(), ShouldSkipZero);
2002+
} else
2003+
printMetadata(Name, MD);
2004+
}
2005+
19892006
template <class IntTy>
19902007
void MDFieldPrinter::printInt(StringRef Name, IntTy Int, bool ShouldSkipZero) {
19912008
if (ShouldSkipZero && !Int)
@@ -2129,38 +2146,21 @@ static void writeDISubrange(raw_ostream &Out, const DISubrange *N,
21292146
Out << "!DISubrange(";
21302147
MDFieldPrinter Printer(Out, WriterCtx);
21312148

2132-
auto *Count = N->getRawCountNode();
2133-
if (auto *CE = dyn_cast_or_null<ConstantAsMetadata>(Count)) {
2134-
auto *CV = cast<ConstantInt>(CE->getValue());
2135-
Printer.printInt("count", CV->getSExtValue(),
2136-
/* ShouldSkipZero */ false);
2137-
} else
2138-
Printer.printMetadata("count", Count, /*ShouldSkipNull */ true);
2149+
Printer.printMetadataOrInt("count", N->getRawCountNode(),
2150+
/* IsUnsigned */ false,
2151+
/* ShouldSkipZero */ false);
21392152

21402153
// A lowerBound of constant 0 should not be skipped, since it is different
21412154
// from an unspecified lower bound (= nullptr).
2142-
auto *LBound = N->getRawLowerBound();
2143-
if (auto *LE = dyn_cast_or_null<ConstantAsMetadata>(LBound)) {
2144-
auto *LV = cast<ConstantInt>(LE->getValue());
2145-
Printer.printInt("lowerBound", LV->getSExtValue(),
2146-
/* ShouldSkipZero */ false);
2147-
} else
2148-
Printer.printMetadata("lowerBound", LBound, /*ShouldSkipNull */ true);
2149-
2150-
auto *UBound = N->getRawUpperBound();
2151-
if (auto *UE = dyn_cast_or_null<ConstantAsMetadata>(UBound)) {
2152-
auto *UV = cast<ConstantInt>(UE->getValue());
2153-
Printer.printInt("upperBound", UV->getSExtValue(),
2154-
/* ShouldSkipZero */ false);
2155-
} else
2156-
Printer.printMetadata("upperBound", UBound, /*ShouldSkipNull */ true);
2157-
2158-
auto *Stride = N->getRawStride();
2159-
if (auto *SE = dyn_cast_or_null<ConstantAsMetadata>(Stride)) {
2160-
auto *SV = cast<ConstantInt>(SE->getValue());
2161-
Printer.printInt("stride", SV->getSExtValue(), /* ShouldSkipZero */ false);
2162-
} else
2163-
Printer.printMetadata("stride", Stride, /*ShouldSkipNull */ true);
2155+
Printer.printMetadataOrInt("lowerBound", N->getRawLowerBound(),
2156+
/* IsUnsigned */ false,
2157+
/* ShouldSkipZero */ false);
2158+
Printer.printMetadataOrInt("upperBound", N->getRawUpperBound(),
2159+
/* IsUnsigned */ false,
2160+
/* ShouldSkipZero */ false);
2161+
Printer.printMetadataOrInt("stride", N->getRawStride(),
2162+
/* IsUnsigned */ false,
2163+
/* ShouldSkipZero */ false);
21642164

21652165
Out << ")";
21662166
}
@@ -2226,13 +2226,13 @@ static void writeDIEnumerator(raw_ostream &Out, const DIEnumerator *N,
22262226
}
22272227

22282228
static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N,
2229-
AsmWriterContext &) {
2229+
AsmWriterContext &WriterCtx) {
22302230
Out << "!DIBasicType(";
2231-
MDFieldPrinter Printer(Out);
2231+
MDFieldPrinter Printer(Out, WriterCtx);
22322232
if (N->getTag() != dwarf::DW_TAG_base_type)
22332233
Printer.printTag(N);
22342234
Printer.printString("name", N->getName());
2235-
Printer.printInt("size", N->getSizeInBits());
2235+
Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
22362236
Printer.printInt("align", N->getAlignInBits());
22372237
Printer.printDwarfEnum("encoding", N->getEncoding(),
22382238
dwarf::AttributeEncodingString);
@@ -2242,13 +2242,13 @@ static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N,
22422242
}
22432243

22442244
static void writeDIFixedPointType(raw_ostream &Out, const DIFixedPointType *N,
2245-
AsmWriterContext &) {
2245+
AsmWriterContext &WriterCtx) {
22462246
Out << "!DIFixedPointType(";
2247-
MDFieldPrinter Printer(Out);
2247+
MDFieldPrinter Printer(Out, WriterCtx);
22482248
if (N->getTag() != dwarf::DW_TAG_base_type)
22492249
Printer.printTag(N);
22502250
Printer.printString("name", N->getName());
2251-
Printer.printInt("size", N->getSizeInBits());
2251+
Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
22522252
Printer.printInt("align", N->getAlignInBits());
22532253
Printer.printDwarfEnum("encoding", N->getEncoding(),
22542254
dwarf::AttributeEncodingString);
@@ -2275,7 +2275,7 @@ static void writeDIStringType(raw_ostream &Out, const DIStringType *N,
22752275
Printer.printMetadata("stringLengthExpression", N->getRawStringLengthExp());
22762276
Printer.printMetadata("stringLocationExpression",
22772277
N->getRawStringLocationExp());
2278-
Printer.printInt("size", N->getSizeInBits());
2278+
Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
22792279
Printer.printInt("align", N->getAlignInBits());
22802280
Printer.printDwarfEnum("encoding", N->getEncoding(),
22812281
dwarf::AttributeEncodingString);
@@ -2293,9 +2293,9 @@ static void writeDIDerivedType(raw_ostream &Out, const DIDerivedType *N,
22932293
Printer.printInt("line", N->getLine());
22942294
Printer.printMetadata("baseType", N->getRawBaseType(),
22952295
/* ShouldSkipNull */ false);
2296-
Printer.printInt("size", N->getSizeInBits());
2296+
Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
22972297
Printer.printInt("align", N->getAlignInBits());
2298-
Printer.printInt("offset", N->getOffsetInBits());
2298+
Printer.printMetadataOrInt("offset", N->getRawOffsetInBits(), true);
22992299
Printer.printDIFlags("flags", N->getFlags());
23002300
Printer.printMetadata("extraData", N->getRawExtraData());
23012301
if (const auto &DWARFAddressSpace = N->getDWARFAddressSpace())
@@ -2323,7 +2323,7 @@ static void writeDISubrangeType(raw_ostream &Out, const DISubrangeType *N,
23232323
Printer.printMetadata("scope", N->getRawScope());
23242324
Printer.printMetadata("file", N->getRawFile());
23252325
Printer.printInt("line", N->getLine());
2326-
Printer.printInt("size", N->getSizeInBits());
2326+
Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
23272327
Printer.printInt("align", N->getAlignInBits());
23282328
Printer.printDIFlags("flags", N->getFlags());
23292329
Printer.printMetadata("baseType", N->getRawBaseType(),
@@ -2345,9 +2345,9 @@ static void writeDICompositeType(raw_ostream &Out, const DICompositeType *N,
23452345
Printer.printMetadata("file", N->getRawFile());
23462346
Printer.printInt("line", N->getLine());
23472347
Printer.printMetadata("baseType", N->getRawBaseType());
2348-
Printer.printInt("size", N->getSizeInBits());
2348+
Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);
23492349
Printer.printInt("align", N->getAlignInBits());
2350-
Printer.printInt("offset", N->getOffsetInBits());
2350+
Printer.printMetadataOrInt("offset", N->getRawOffsetInBits(), true);
23512351
Printer.printInt("num_extra_inhabitants", N->getNumExtraInhabitants());
23522352
Printer.printDIFlags("flags", N->getFlags());
23532353
Printer.printMetadata("elements", N->getRawElements());

llvm/test/DebugInfo/X86/dynamic-bitfield.ll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
; RUN: llc -mtriple=x86_64 -O0 -filetype=obj -o - %s | llvm-dwarfdump -v -debug-info - | FileCheck %s
1+
; The use of llvm-dis here tests that round-tripping the IR works
2+
; correctly for the expression case.
3+
; RUN: llvm-as < %s | llvm-dis | llc -mtriple=x86_64 -O0 -filetype=obj -o - | llvm-dwarfdump -v -debug-info - | FileCheck %s
24

35
; A basic test of using a DIExpression for DW_AT_data_bit_offset and
46
; DW_AT_bit_size.

0 commit comments

Comments
 (0)