@@ -36,8 +36,10 @@ struct CommonFixture {
36
36
EXPECT_FALSE (Unrecoverable);
37
37
}
38
38
39
- bool setupGenerator (uint16_t Version = 4 ) {
40
- Triple T = getDefaultTargetTripleForAddrSize (8 );
39
+ bool setupGenerator (uint16_t Version = 4 , uint8_t AddrSize = 8 ) {
40
+ AddressSize = AddrSize;
41
+ Triple T =
42
+ getDefaultTargetTripleForAddrSize (AddressSize == 0 ? 8 : AddressSize);
41
43
if (!isConfigurationSupported (T))
42
44
return false ;
43
45
auto ExpectedGenerator = Generator::create (T, Version);
@@ -50,9 +52,11 @@ struct CommonFixture {
50
52
Context = createContext ();
51
53
assert (Context != nullptr && " test state is not valid" );
52
54
const DWARFObject &Obj = Context->getDWARFObj ();
55
+ uint8_t TargetAddrSize = AddressSize == 0 ? 8 : AddressSize;
53
56
LineData = DWARFDataExtractor (
54
57
Obj, Obj.getLineSection (),
55
- getDefaultTargetTripleForAddrSize (8 ).isLittleEndian (), 8 );
58
+ getDefaultTargetTripleForAddrSize (TargetAddrSize).isLittleEndian (),
59
+ AddressSize);
56
60
}
57
61
58
62
std::unique_ptr<DWARFContext> createContext () {
@@ -130,6 +134,7 @@ struct CommonFixture {
130
134
checkError (ExpectedMsgs, ExpectedLineTable.takeError ());
131
135
}
132
136
137
+ uint8_t AddressSize;
133
138
std::unique_ptr<Generator> Gen;
134
139
std::unique_ptr<DWARFContext> Context;
135
140
DWARFDataExtractor LineData;
@@ -468,20 +473,59 @@ TEST_F(DebugLineBasicFixture, ErrorForUnitLengthTooLarge) {
468
473
}
469
474
470
475
TEST_F (DebugLineBasicFixture, ErrorForMismatchedAddressSize) {
471
- if (!setupGenerator ())
476
+ if (!setupGenerator (4 , 8 ))
472
477
return ;
473
478
474
479
LineTable < = Gen->addLineTable ();
475
480
// The line data extractor expects size 8 (Quad) addresses.
476
- LT.addExtendedOpcode (5 , DW_LNE_set_address, {{0x11223344 , LineTable::Long}});
481
+ uint64_t Addr1 = 0x11223344 ;
482
+ LT.addExtendedOpcode (5 , DW_LNE_set_address, {{Addr1, LineTable::Long}});
477
483
LT.addStandardOpcode (DW_LNS_copy, {});
478
- LT.addByte (0xaa );
484
+ // Show that the expected address size is unchanged, so later valid lines
485
+ // don't cause a problem.
486
+ uint64_t Addr2 = 0x1122334455667788 ;
487
+ LT.addExtendedOpcode (9 , DW_LNE_set_address, {{Addr2, LineTable::Quad}});
479
488
LT.addExtendedOpcode (1 , DW_LNE_end_sequence, {});
480
489
481
490
generate ();
482
491
483
- checkGetOrParseLineTableEmitsFatalError (
484
- " mismatching address size at offset 0x00000030 expected 0x08 found 0x04" );
492
+ auto ExpectedLineTable = Line.getOrParseLineTable (LineData, 0 , *Context,
493
+ nullptr , RecordRecoverable);
494
+ checkError (
495
+ " mismatching address size at offset 0x00000030 expected 0x08 found 0x04" ,
496
+ std::move (Recoverable));
497
+ ASSERT_THAT_EXPECTED (ExpectedLineTable, Succeeded ());
498
+ ASSERT_EQ ((*ExpectedLineTable)->Rows .size (), 2u );
499
+ EXPECT_EQ ((*ExpectedLineTable)->Sequences .size (), 1u );
500
+ EXPECT_EQ ((*ExpectedLineTable)->Rows [0 ].Address .Address , Addr1);
501
+ EXPECT_EQ ((*ExpectedLineTable)->Rows [1 ].Address .Address , Addr2);
502
+ }
503
+
504
+ TEST_F (DebugLineBasicFixture,
505
+ ErrorForMismatchedAddressSizeUnsetInitialAddress) {
506
+ if (!setupGenerator (4 , 0 ))
507
+ return ;
508
+
509
+ LineTable < = Gen->addLineTable ();
510
+ uint64_t Addr1 = 0x11223344 ;
511
+ LT.addExtendedOpcode (5 , DW_LNE_set_address, {{Addr1, LineTable::Long}});
512
+ LT.addStandardOpcode (DW_LNS_copy, {});
513
+ uint64_t Addr2 = 0x1122334455667788 ;
514
+ LT.addExtendedOpcode (9 , DW_LNE_set_address, {{Addr2, LineTable::Quad}});
515
+ LT.addExtendedOpcode (1 , DW_LNE_end_sequence, {});
516
+
517
+ generate ();
518
+
519
+ auto ExpectedLineTable = Line.getOrParseLineTable (LineData, 0 , *Context,
520
+ nullptr , RecordRecoverable);
521
+ checkError (
522
+ " mismatching address size at offset 0x00000038 expected 0x04 found 0x08" ,
523
+ std::move (Recoverable));
524
+ ASSERT_THAT_EXPECTED (ExpectedLineTable, Succeeded ());
525
+ ASSERT_EQ ((*ExpectedLineTable)->Rows .size (), 2u );
526
+ EXPECT_EQ ((*ExpectedLineTable)->Sequences .size (), 1u );
527
+ EXPECT_EQ ((*ExpectedLineTable)->Rows [0 ].Address .Address , Addr1);
528
+ EXPECT_EQ ((*ExpectedLineTable)->Rows [1 ].Address .Address , Addr2);
485
529
}
486
530
487
531
TEST_F (DebugLineBasicFixture, CallbackUsedForUnterminatedSequence) {
0 commit comments