Skip to content

Commit c9845ee

Browse files
committed
saturate, scope
1 parent aee3776 commit c9845ee

File tree

3 files changed

+39
-28
lines changed

3 files changed

+39
-28
lines changed

llvm/lib/Object/SFrameParser.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@
1010
#include "llvm/BinaryFormat/SFrame.h"
1111
#include "llvm/Object/Error.h"
1212
#include "llvm/Support/FormatVariadic.h"
13+
#include "llvm/Support/MathExtras.h"
1314

1415
using namespace llvm;
1516
using namespace llvm::object;
1617

1718
static Expected<ArrayRef<uint8_t>>
1819
getDataSlice(ArrayRef<uint8_t> Data, uint64_t Offset, uint64_t Size) {
19-
// Check for overflow.
20-
if (Offset + Size < Offset || Offset + Size < Size ||
21-
Offset + Size > Data.size()) {
20+
uint64_t End = SaturatingAdd(Offset, Size);
21+
// Data.size() cannot be UINT64_MAX, as it would occupy the whole address
22+
// space.
23+
if (End > Data.size()) {
2224
return createStringError(
2325
formatv("unexpected end of data at offset {0:x} while reading [{1:x}, "
2426
"{2:x})",
25-
Data.size(), Offset, Offset + Size)
27+
Data.size(), Offset, End)
2628
.str(),
2729
object_error::unexpected_eof);
2830
}

llvm/test/tools/llvm-readobj/ELF/sframe-fde.test

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,11 @@ Sections:
101101
# CASE1-NEXT: Size: 0x1BE
102102
# CASE1-NEXT: Start FRE Offset: 0x10
103103
# CASE1-NEXT: Num FREs: 0
104-
# CASE1-NEXT: Info: 0x31
105-
# CASE1-NEXT: FRE Type: Addr2 (0x1)
106-
# CASE1-NEXT: FDE Type: PCMask (0x1)
107-
# CASE1-NEXT: PAuth Key (unused): 1
104+
# CASE1-NEXT: Info {
105+
# CASE1-NEXT: FRE Type: Addr2 (0x1)
106+
# CASE1-NEXT: FDE Type: PCMask (0x1)
107+
# CASE1-NEXT: Raw: 0x31
108+
# CASE1-NEXT: }
108109
# CASE1-NEXT: Repetitive block size: 0xDE
109110
# CASE1-NEXT: Padding2: 0xAD
110111
# CASE1-NEXT: }
@@ -160,10 +161,12 @@ Sections:
160161
# CASE1-NEXT: Size: 0x1BE
161162
# CASE1-NEXT: Start FRE Offset: 0x10
162163
# CASE1-NEXT: Num FREs: 0
163-
# CASE1-NEXT: Info: 0x2
164-
# CASE1-NEXT: FRE Type: Addr4 (0x2)
165-
# CASE1-NEXT: FDE Type: PCInc (0x0)
166-
# CASE1-NEXT: PAuth Key: A (0x0)
164+
# CASE1-NEXT: Info {
165+
# CASE1-NEXT: FRE Type: Addr4 (0x2)
166+
# CASE1-NEXT: FDE Type: PCInc (0x0)
167+
# CASE1-NEXT: PAuth Key: A (0x0)
168+
# CASE1-NEXT: Raw: 0x2
169+
# CASE1-NEXT: }
167170
# CASE1-NEXT: Repetitive block size (unused): 0xDE
168171
# CASE1-NEXT: Padding2: 0xAD
169172
# CASE1-NEXT: }
@@ -221,10 +224,12 @@ Sections:
221224
# CASE2-NEXT: Size: 0x1BE
222225
# CASE2-NEXT: Start FRE Offset: 0x10
223226
# CASE2-NEXT: Num FREs: 16
224-
# CASE2-NEXT: Info: 0x2
225-
# CASE2-NEXT: FRE Type: Addr4 (0x2)
226-
# CASE2-NEXT: FDE Type: PCInc (0x0)
227-
# CASE2-NEXT: PAuth Key: A (0x0)
227+
# CASE2-NEXT: Info {
228+
# CASE2-NEXT: FRE Type: Addr4 (0x2)
229+
# CASE2-NEXT: FDE Type: PCInc (0x0)
230+
# CASE2-NEXT: PAuth Key: A (0x0)
231+
# CASE2-NEXT: Raw: 0x2
232+
# CASE2-NEXT: }
228233
# CASE2-NEXT: Repetitive block size (unused): 0xDE
229234
# CASE2-NEXT: Padding2: 0xAD00
230235
# CASE2-NEXT: }

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6498,18 +6498,22 @@ void ELFDumper<ELFT>::printSFrameFDEs(
64986498
W.printHex("Start FRE Offset", It->StartFREOff);
64996499
W.printNumber("Num FREs", It->NumFREs);
65006500

6501-
W.printHex("Info", It->Info);
6502-
W.printEnum("FRE Type", It->getFREType(), sframe::getFRETypes());
6503-
W.printEnum("FDE Type", It->getFDEType(), sframe::getFDETypes());
6504-
switch (Parser.getHeader().ABIArch) {
6505-
case sframe::ABI::AArch64EndianBig:
6506-
case sframe::ABI::AArch64EndianLittle:
6507-
W.printEnum("PAuth Key", sframe::AArch64PAuthKey(It->getPAuthKey()),
6508-
sframe::getAArch64PAuthKeys());
6509-
break;
6510-
default:
6511-
W.printNumber("PAuth Key (unused)", It->getPAuthKey());
6512-
break;
6501+
{
6502+
DictScope InfoScope(W, "Info");
6503+
W.printEnum("FRE Type", It->getFREType(), sframe::getFRETypes());
6504+
W.printEnum("FDE Type", It->getFDEType(), sframe::getFDETypes());
6505+
switch (Parser.getHeader().ABIArch) {
6506+
case sframe::ABI::AArch64EndianBig:
6507+
case sframe::ABI::AArch64EndianLittle:
6508+
W.printEnum("PAuth Key", sframe::AArch64PAuthKey(It->getPAuthKey()),
6509+
sframe::getAArch64PAuthKeys());
6510+
break;
6511+
case sframe::ABI::AMD64EndianLittle:
6512+
// unused
6513+
break;
6514+
}
6515+
6516+
W.printHex("Raw", It->Info);
65136517
}
65146518

65156519
W.printHex(

0 commit comments

Comments
 (0)