@@ -1914,6 +1914,8 @@ struct MDFieldPrinter {
1914
1914
bool ShouldSkipEmpty = true );
1915
1915
void printMetadata (StringRef Name, const Metadata *MD,
1916
1916
bool ShouldSkipNull = true );
1917
+ void printMetadataOrInt (StringRef Name, const Metadata *MD, bool IsUnsigned,
1918
+ bool ShouldSkipZero = true );
1917
1919
template <class IntTy >
1918
1920
void printInt (StringRef Name, IntTy Int, bool ShouldSkipZero = true );
1919
1921
void printAPInt (StringRef Name, const APInt &Int, bool IsUnsigned,
@@ -1986,6 +1988,21 @@ void MDFieldPrinter::printMetadata(StringRef Name, const Metadata *MD,
1986
1988
writeMetadataAsOperand (Out, MD, WriterCtx);
1987
1989
}
1988
1990
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
+
1989
2006
template <class IntTy >
1990
2007
void MDFieldPrinter::printInt (StringRef Name, IntTy Int, bool ShouldSkipZero) {
1991
2008
if (ShouldSkipZero && !Int)
@@ -2129,38 +2146,21 @@ static void writeDISubrange(raw_ostream &Out, const DISubrange *N,
2129
2146
Out << " !DISubrange(" ;
2130
2147
MDFieldPrinter Printer (Out, WriterCtx);
2131
2148
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 );
2139
2152
2140
2153
// A lowerBound of constant 0 should not be skipped, since it is different
2141
2154
// 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 );
2164
2164
2165
2165
Out << " )" ;
2166
2166
}
@@ -2226,13 +2226,13 @@ static void writeDIEnumerator(raw_ostream &Out, const DIEnumerator *N,
2226
2226
}
2227
2227
2228
2228
static void writeDIBasicType (raw_ostream &Out, const DIBasicType *N,
2229
- AsmWriterContext &) {
2229
+ AsmWriterContext &WriterCtx ) {
2230
2230
Out << " !DIBasicType(" ;
2231
- MDFieldPrinter Printer (Out);
2231
+ MDFieldPrinter Printer (Out, WriterCtx );
2232
2232
if (N->getTag () != dwarf::DW_TAG_base_type)
2233
2233
Printer.printTag (N);
2234
2234
Printer.printString (" name" , N->getName ());
2235
- Printer.printInt (" size" , N->getSizeInBits () );
2235
+ Printer.printMetadataOrInt (" size" , N->getRawSizeInBits (), true );
2236
2236
Printer.printInt (" align" , N->getAlignInBits ());
2237
2237
Printer.printDwarfEnum (" encoding" , N->getEncoding (),
2238
2238
dwarf::AttributeEncodingString);
@@ -2242,13 +2242,13 @@ static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N,
2242
2242
}
2243
2243
2244
2244
static void writeDIFixedPointType (raw_ostream &Out, const DIFixedPointType *N,
2245
- AsmWriterContext &) {
2245
+ AsmWriterContext &WriterCtx ) {
2246
2246
Out << " !DIFixedPointType(" ;
2247
- MDFieldPrinter Printer (Out);
2247
+ MDFieldPrinter Printer (Out, WriterCtx );
2248
2248
if (N->getTag () != dwarf::DW_TAG_base_type)
2249
2249
Printer.printTag (N);
2250
2250
Printer.printString (" name" , N->getName ());
2251
- Printer.printInt (" size" , N->getSizeInBits () );
2251
+ Printer.printMetadataOrInt (" size" , N->getRawSizeInBits (), true );
2252
2252
Printer.printInt (" align" , N->getAlignInBits ());
2253
2253
Printer.printDwarfEnum (" encoding" , N->getEncoding (),
2254
2254
dwarf::AttributeEncodingString);
@@ -2275,7 +2275,7 @@ static void writeDIStringType(raw_ostream &Out, const DIStringType *N,
2275
2275
Printer.printMetadata (" stringLengthExpression" , N->getRawStringLengthExp ());
2276
2276
Printer.printMetadata (" stringLocationExpression" ,
2277
2277
N->getRawStringLocationExp ());
2278
- Printer.printInt (" size" , N->getSizeInBits () );
2278
+ Printer.printMetadataOrInt (" size" , N->getRawSizeInBits (), true );
2279
2279
Printer.printInt (" align" , N->getAlignInBits ());
2280
2280
Printer.printDwarfEnum (" encoding" , N->getEncoding (),
2281
2281
dwarf::AttributeEncodingString);
@@ -2293,9 +2293,9 @@ static void writeDIDerivedType(raw_ostream &Out, const DIDerivedType *N,
2293
2293
Printer.printInt (" line" , N->getLine ());
2294
2294
Printer.printMetadata (" baseType" , N->getRawBaseType (),
2295
2295
/* ShouldSkipNull */ false );
2296
- Printer.printInt (" size" , N->getSizeInBits () );
2296
+ Printer.printMetadataOrInt (" size" , N->getRawSizeInBits (), true );
2297
2297
Printer.printInt (" align" , N->getAlignInBits ());
2298
- Printer.printInt (" offset" , N->getOffsetInBits () );
2298
+ Printer.printMetadataOrInt (" offset" , N->getRawOffsetInBits (), true );
2299
2299
Printer.printDIFlags (" flags" , N->getFlags ());
2300
2300
Printer.printMetadata (" extraData" , N->getRawExtraData ());
2301
2301
if (const auto &DWARFAddressSpace = N->getDWARFAddressSpace ())
@@ -2323,7 +2323,7 @@ static void writeDISubrangeType(raw_ostream &Out, const DISubrangeType *N,
2323
2323
Printer.printMetadata (" scope" , N->getRawScope ());
2324
2324
Printer.printMetadata (" file" , N->getRawFile ());
2325
2325
Printer.printInt (" line" , N->getLine ());
2326
- Printer.printInt (" size" , N->getSizeInBits () );
2326
+ Printer.printMetadataOrInt (" size" , N->getRawSizeInBits (), true );
2327
2327
Printer.printInt (" align" , N->getAlignInBits ());
2328
2328
Printer.printDIFlags (" flags" , N->getFlags ());
2329
2329
Printer.printMetadata (" baseType" , N->getRawBaseType (),
@@ -2345,9 +2345,9 @@ static void writeDICompositeType(raw_ostream &Out, const DICompositeType *N,
2345
2345
Printer.printMetadata (" file" , N->getRawFile ());
2346
2346
Printer.printInt (" line" , N->getLine ());
2347
2347
Printer.printMetadata (" baseType" , N->getRawBaseType ());
2348
- Printer.printInt (" size" , N->getSizeInBits () );
2348
+ Printer.printMetadataOrInt (" size" , N->getRawSizeInBits (), true );
2349
2349
Printer.printInt (" align" , N->getAlignInBits ());
2350
- Printer.printInt (" offset" , N->getOffsetInBits () );
2350
+ Printer.printMetadataOrInt (" offset" , N->getRawOffsetInBits (), true );
2351
2351
Printer.printInt (" num_extra_inhabitants" , N->getNumExtraInhabitants ());
2352
2352
Printer.printDIFlags (" flags" , N->getFlags ());
2353
2353
Printer.printMetadata (" elements" , N->getRawElements ());
0 commit comments