@@ -505,7 +505,7 @@ static Error materializeDebugInfoOpt(MCCASReader &Reader,
505
505
StringRef FormData, bool ) {
506
506
if (Form == dwarf::Form::DW_FORM_ref4_cas ||
507
507
Form == dwarf::Form::DW_FORM_strp_cas) {
508
- DataExtractor Extractor (FormData, true , 8 );
508
+ DataExtractor Extractor (FormData, true , Reader. getAddressSize () );
509
509
DataExtractor::Cursor Cursor (0 );
510
510
uint64_t Data64 = Extractor.getULEB128 (Cursor);
511
511
if (!Cursor)
@@ -529,7 +529,7 @@ static Error materializeDebugInfoOpt(MCCASReader &Reader,
529
529
530
530
if (auto E = visitDebugInfo (TotAbbrevEntries, std::move (MaybeTopRef),
531
531
HeaderCallback, StartTagCallback, AttrCallback,
532
- EndTagCallback))
532
+ EndTagCallback, Reader. getAddressSize () ))
533
533
return E;
534
534
}
535
535
return Error::success ();
@@ -826,10 +826,11 @@ getLineTableLengthInfoAndVersion(DWARFDataExtractor &LineTableDataReader,
826
826
auto AddressSize = LineTableDataReader.getU8 (OffsetPtr, &Err);
827
827
if (Err)
828
828
return std::move (Err);
829
- if (AddressSize != 8 )
829
+ if (AddressSize != LineTableDataReader. getAddressSize () )
830
830
return createStringError (
831
831
inconvertibleErrorCode (),
832
- " Address size is not 8 bytes, unsupported architecture for MCCAS!" );
832
+ " Address size in line table header is not the same as Address size "
833
+ " for the target architecture, something went really wrong!" );
833
834
LineTableDataReader.getU8 (OffsetPtr, &Err);
834
835
if (Err)
835
836
return std::move (Err);
@@ -956,9 +957,12 @@ handleStandardOpcodesForLineTable(DWARFDataExtractor &LineTableDataReader,
956
957
static Expected<std::pair<uint64_t , uint64_t >>
957
958
getOpcodeAndOperandSize (StringRef DistinctData, StringRef LineTableData,
958
959
uint64_t DistinctOffset, uint64_t LineTableOffset,
959
- bool IsLittleEndian, uint8_t OpcodeBase) {
960
- DWARFDataExtractor LineTableDataReader (LineTableData, IsLittleEndian, 8 );
961
- DWARFDataExtractor DistinctDataReader (DistinctData, IsLittleEndian, 8 );
960
+ bool IsLittleEndian, uint8_t OpcodeBase,
961
+ uint8_t AddressSize) {
962
+ DWARFDataExtractor LineTableDataReader (LineTableData, IsLittleEndian,
963
+ AddressSize);
964
+ DWARFDataExtractor DistinctDataReader (DistinctData, IsLittleEndian,
965
+ AddressSize);
962
966
DWARFDataExtractor::Cursor LineTableCursor (LineTableOffset);
963
967
DWARFDataExtractor::Cursor DistinctCursor (DistinctOffset);
964
968
@@ -1068,7 +1072,7 @@ materializeDebugLineSection(MCCASReader &Reader,
1068
1072
assert ((Endian == endianness::big || Endian == endianness::little) &&
1069
1073
" Endian must be either big or little" );
1070
1074
DWARFDataExtractor LineTableDataReader (Data, Endian == endianness::little,
1071
- 8 );
1075
+ Reader. getAddressSize () );
1072
1076
auto Prologue = parseLineTableHeaderAndSkip (LineTableDataReader);
1073
1077
if (!Prologue)
1074
1078
return Prologue.takeError ();
@@ -1093,7 +1097,7 @@ materializeDebugLineSection(MCCASReader &Reader,
1093
1097
" Endian must be either big or little" );
1094
1098
auto Sizes = getOpcodeAndOperandSize (
1095
1099
toStringRef (DistinctData), Data, DistinctOffset, LineTableOffset,
1096
- Endian == endianness::little, OpcodeBase);
1100
+ Endian == endianness::little, OpcodeBase, Reader. getAddressSize () );
1097
1101
if (!Sizes)
1098
1102
return Sizes.takeError ();
1099
1103
// Copy opcode and operand, only in the case of DW_LNS_set_file, the
@@ -1732,11 +1736,11 @@ static Expected<size_t> getSizeFromDwarfHeader(DataExtractor &Extractor,
1732
1736
// / contained in CUData, as well as the total number of bytes taken by the CU.
1733
1737
// / Note: this is different from the length field of the Dwarf header, which
1734
1738
// / does not account for the header size.
1735
- static Expected<CUInfo>
1736
- getAndSetDebugAbbrevOffsetAndSkip ( MutableArrayRef<char > CUData,
1737
- endianness Endian,
1738
- std::optional< uint32_t > NewOffset) {
1739
- DataExtractor Extractor ( toStringRef (CUData), Endian == endianness::little, 8 );
1739
+ static Expected<CUInfo> getAndSetDebugAbbrevOffsetAndSkip (
1740
+ MutableArrayRef<char > CUData, endianness Endian ,
1741
+ std::optional< uint32_t > NewOffset, uint8_t AddressSize) {
1742
+ DataExtractor Extractor ( toStringRef (CUData), Endian == endianness::little,
1743
+ AddressSize );
1740
1744
DataExtractor::Cursor Cursor (0 );
1741
1745
Expected<size_t > Size = getSizeFromDwarfHeader (Extractor, Cursor);
1742
1746
if (!Size)
@@ -1760,13 +1764,14 @@ getAndSetDebugAbbrevOffsetAndSkip(MutableArrayRef<char> CUData,
1760
1764
return createStringError (
1761
1765
inconvertibleErrorCode (),
1762
1766
" Unit type is not DW_UT_compile, and is incompatible with MCCAS!" );
1763
- uint8_t AddressSize = Extractor.getU8 (Cursor);
1767
+ uint8_t HeaderAddressSize = Extractor.getU8 (Cursor);
1764
1768
if (!Cursor)
1765
1769
return Cursor.takeError ();
1766
- if (AddressSize != 8 )
1770
+ if (HeaderAddressSize != AddressSize )
1767
1771
return createStringError (
1768
1772
inconvertibleErrorCode (),
1769
- " Address size is not 8 bytes, unsupported architecture for MCCAS!" );
1773
+ " Address size in Compile Unit header is not the same as Address size "
1774
+ " for the target architecture, something went really wrong!" );
1770
1775
}
1771
1776
1772
1777
// TODO: Handle Dwarf 64 format, which uses 8 bytes.
@@ -1821,7 +1826,8 @@ MCCASBuilder::splitDebugInfoSectionData(MutableArrayRef<char> DebugInfoData) {
1821
1826
// CU splitting loop.
1822
1827
while (!DebugInfoData.empty ()) {
1823
1828
Expected<CUInfo> Info = getAndSetDebugAbbrevOffsetAndSkip (
1824
- DebugInfoData, Asm.getBackend ().Endian , /* NewOffset*/ 0 );
1829
+ DebugInfoData, Asm.getBackend ().Endian , /* NewOffset*/ 0 ,
1830
+ ObjectWriter.getAddressSize ());
1825
1831
if (!Info)
1826
1832
return Info.takeError ();
1827
1833
Split.SplitCUData .push_back (DebugInfoData.take_front (Info->CUSize ));
@@ -1987,13 +1993,16 @@ Error InMemoryCASDWARFObject::partitionCUData(ArrayRef<char> DebugInfoData,
1987
1993
uint16_t DwarfVersion) {
1988
1994
StringRef AbbrevSectionContribution =
1989
1995
getAbbrevSection ().drop_front (AbbrevOffset);
1990
- DataExtractor Data (AbbrevSectionContribution, isLittleEndian (), 8 );
1996
+ DataExtractor Data (AbbrevSectionContribution, isLittleEndian (),
1997
+ Builder.ObjectWriter .getAddressSize ());
1991
1998
DWARFDebugAbbrev Abbrev (Data);
1992
1999
uint64_t OffsetPtr = 0 ;
1993
2000
DWARFUnitHeader Header;
1994
2001
DWARFSection Section = {toStringRef (DebugInfoData), 0 /* Address*/ };
1995
2002
if (Error E = Header.extract (
1996
- *Ctx, DWARFDataExtractor (*this , Section, isLittleEndian (), 8 ),
2003
+ *Ctx,
2004
+ DWARFDataExtractor (*this , Section, isLittleEndian (),
2005
+ Builder.ObjectWriter .getAddressSize ()),
1997
2006
&OffsetPtr, DWARFSectionKind::DW_SECT_INFO))
1998
2007
return E;
1999
2008
@@ -2096,7 +2105,8 @@ MCCASBuilder::createOptimizedLineSection(StringRef DebugLineStrRef) {
2096
2105
assert ((Endian == endianness::big || Endian == endianness::little) &&
2097
2106
" Endian must be either big or little" );
2098
2107
DWARFDataExtractor LineTableDataReader (DebugLineStrRef,
2099
- Endian == endianness::little, 8 );
2108
+ Endian == endianness::little,
2109
+ ObjectWriter.getAddressSize ());
2100
2110
auto Prologue = parseLineTableHeaderAndSkip (LineTableDataReader);
2101
2111
if (!Prologue)
2102
2112
return Prologue.takeError ();
@@ -3138,20 +3148,19 @@ Error DIEVisitor::visitDIEAttrs(DataExtractor &Extractor,
3138
3148
StringRef DIEData,
3139
3149
ArrayRef<AbbrevContent> DIEContents) {
3140
3150
constexpr auto IsLittleEndian = true ;
3141
- constexpr auto AddrSize = 8 ;
3142
- auto FormParams =
3143
- dwarf::FormParams{DwarfVersion, AddrSize, dwarf::DwarfFormat::DWARF32};
3151
+ auto FormParams = dwarf::FormParams{DwarfVersion, Extractor.getAddressSize (),
3152
+ dwarf::DwarfFormat::DWARF32};
3144
3153
3145
3154
for (auto Contents : DIEContents) {
3146
3155
bool DataInDistinct = Contents.FormInDistinctData ;
3147
3156
auto &ExtractorForData = DataInDistinct ? DistinctExtractor : Extractor;
3148
3157
auto &CursorForData = DataInDistinct ? DistinctCursor : Cursor;
3149
3158
StringRef DataToUse = DataInDistinct ? DistinctData : DIEData;
3150
3159
Expected<uint64_t > FormSize =
3151
- Contents.FormSize
3152
- ? * Contents.FormSize
3153
- : getFormSize (Contents. Form , FormParams, DataToUse ,
3154
- CursorForData. tell (), IsLittleEndian, AddrSize );
3160
+ Contents.FormSize ? *Contents. FormSize
3161
+ : getFormSize ( Contents.Form , FormParams, DataToUse,
3162
+ CursorForData. tell (), IsLittleEndian ,
3163
+ Extractor. getAddressSize () );
3155
3164
if (!FormSize)
3156
3165
return FormSize.takeError ();
3157
3166
@@ -3252,9 +3261,9 @@ static std::optional<uint8_t> getNonULEBFormSize(dwarf::Form Form,
3252
3261
}
3253
3262
3254
3263
Error DIEVisitor::materializeAbbrevDIE (unsigned AbbrevIdx) {
3255
- constexpr auto AddrSize = 8 ;
3256
3264
auto FormParams =
3257
- dwarf::FormParams{DwarfVersion, AddrSize, dwarf::DwarfFormat::DWARF32};
3265
+ dwarf::FormParams{DwarfVersion, DistinctExtractor.getAddressSize (),
3266
+ dwarf::DwarfFormat::DWARF32};
3258
3267
3259
3268
AbbrevEntryReader AbbrevReader =
3260
3269
getAbbrevEntryReader (AbbrevEntries, AbbrevIdx);
@@ -3292,9 +3301,10 @@ Error DIEVisitor::materializeAbbrevDIE(unsigned AbbrevIdx) {
3292
3301
// / previous stack frame.
3293
3302
static void popStack (DataExtractor &Extractor, DataExtractor::Cursor &Cursor,
3294
3303
StringRef &Data,
3295
- std::stack<std::pair<StringRef, unsigned >> &StackOfNodes) {
3304
+ std::stack<std::pair<StringRef, unsigned >> &StackOfNodes,
3305
+ uint8_t AddressSize) {
3296
3306
auto DataAndOffset = StackOfNodes.top ();
3297
- Extractor = DataExtractor (DataAndOffset.first , true , 8 );
3307
+ Extractor = DataExtractor (DataAndOffset.first , true , AddressSize );
3298
3308
Data = DataAndOffset.first ;
3299
3309
Cursor.seek (DataAndOffset.second );
3300
3310
StackOfNodes.pop ();
@@ -3310,7 +3320,7 @@ Error DIEVisitor::visitDIERef(ArrayRef<DIEDataRef> &DIEChildrenStack) {
3310
3320
std::stack<std::pair<StringRef, unsigned >> StackOfNodes;
3311
3321
auto Data = DIEChildrenStack.empty () ? StringRef ()
3312
3322
: DIEChildrenStack.front ().getData ();
3313
- DataExtractor Extractor (Data, true , 8 );
3323
+ DataExtractor Extractor (Data, true , DistinctExtractor. getAddressSize () );
3314
3324
DataExtractor::Cursor Cursor (0 );
3315
3325
3316
3326
while (!DistinctExtractor.eof (DistinctCursor)) {
@@ -3327,7 +3337,8 @@ Error DIEVisitor::visitDIERef(ArrayRef<DIEDataRef> &DIEChildrenStack) {
3327
3337
if (AbbrevIdx == getEndOfDIESiblingsMarker ()) {
3328
3338
EndTagCallback (true /* HadChildren*/ );
3329
3339
if (!StackOfNodes.empty () && Extractor.eof (Cursor))
3330
- popStack (Extractor, Cursor, Data, StackOfNodes);
3340
+ popStack (Extractor, Cursor, Data, StackOfNodes,
3341
+ DistinctExtractor.getAddressSize ());
3331
3342
continue ;
3332
3343
}
3333
3344
@@ -3339,7 +3350,7 @@ Error DIEVisitor::visitDIERef(ArrayRef<DIEDataRef> &DIEChildrenStack) {
3339
3350
DIEChildrenStack = DIEChildrenStack.drop_front ();
3340
3351
Data = DIEChildrenStack.front ().getData ();
3341
3352
NewBlockCallback (DIEChildrenStack.front ().getID ().toString ());
3342
- Extractor = DataExtractor (Data, true , 8 );
3353
+ Extractor = DataExtractor (Data, true , DistinctExtractor. getAddressSize () );
3343
3354
Cursor.seek (0 );
3344
3355
continue ;
3345
3356
}
@@ -3358,7 +3369,8 @@ Error DIEVisitor::visitDIERef(ArrayRef<DIEDataRef> &DIEChildrenStack) {
3358
3369
// parent's siblings that may exist.
3359
3370
if (!AbbrevEntryCacheVal.HasChildren ) {
3360
3371
if (!StackOfNodes.empty () && Extractor.eof (Cursor))
3361
- popStack (Extractor, Cursor, Data, StackOfNodes);
3372
+ popStack (Extractor, Cursor, Data, StackOfNodes,
3373
+ DistinctExtractor.getAddressSize ());
3362
3374
EndTagCallback (false /* HadChildren*/ );
3363
3375
}
3364
3376
}
@@ -3398,7 +3410,7 @@ Error mccasformats::v1::visitDebugInfo(
3398
3410
std::function<void(dwarf::Tag, uint64_t )> StartTagCallback,
3399
3411
std::function<void(dwarf::Attribute, dwarf::Form, StringRef, bool )>
3400
3412
AttrCallback,
3401
- std::function<void(bool )> EndTagCallback,
3413
+ std::function<void(bool )> EndTagCallback, uint8_t AddressSize,
3402
3414
std::function<void(StringRef)> NewBlockCallback) {
3403
3415
3404
3416
Expected<LoadedDIETopLevel> LoadedTopRef =
@@ -3417,7 +3429,7 @@ Error mccasformats::v1::visitDebugInfo(
3417
3429
return E;
3418
3430
DistinctData = toStringRef (OutBuff);
3419
3431
#endif
3420
- DataExtractor DistinctExtractor (DistinctData, true , 8 );
3432
+ DataExtractor DistinctExtractor (DistinctData, true , AddressSize );
3421
3433
DataExtractor::Cursor DistinctCursor (0 );
3422
3434
3423
3435
auto Size = getSizeFromDwarfHeader (DistinctExtractor, DistinctCursor);
0 commit comments