@@ -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+
19892006template <class IntTy >
19902007void 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
22282228static 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
22442244static 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 ());
0 commit comments