forked from OSchip/llvm-project
[DWARFYAML][debug_ranges] Emit an error message for invalid offset.
This patch helps make yaml2obj emit an error message when we try to assign an invalid offset to the entry of the 'debug_ranges' section. Reviewed By: jhenderson Differential Revision: https://reviews.llvm.org/D81357
This commit is contained in:
parent
658af94350
commit
e4344e1466
|
@ -82,7 +82,7 @@ struct RangeEntry {
|
|||
|
||||
/// Class that describes a single range list inside the .debug_ranges section.
|
||||
struct Ranges {
|
||||
llvm::yaml::Hex32 Offset;
|
||||
llvm::yaml::Hex64 Offset;
|
||||
llvm::yaml::Hex8 AddrSize;
|
||||
std::vector<RangeEntry> Entries;
|
||||
};
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/BinaryFormat/Dwarf.h"
|
||||
#include "llvm/ObjectYAML/DWARFYAML.h"
|
||||
#include "llvm/Support/Errc.h"
|
||||
#include "llvm/Support/Error.h"
|
||||
#include "llvm/Support/Host.h"
|
||||
#include "llvm/Support/LEB128.h"
|
||||
|
@ -127,11 +128,16 @@ Error DWARFYAML::emitDebugAranges(raw_ostream &OS, const DWARFYAML::Data &DI) {
|
|||
|
||||
Error DWARFYAML::emitDebugRanges(raw_ostream &OS, const DWARFYAML::Data &DI) {
|
||||
const size_t RangesOffset = OS.tell();
|
||||
uint64_t EntryIndex = 0;
|
||||
for (auto DebugRanges : DI.DebugRanges) {
|
||||
const size_t CurrOffset = OS.tell() - RangesOffset;
|
||||
assert(DebugRanges.Offset >= CurrOffset &&
|
||||
"Offset should be greater than or equal to the bytes that we have "
|
||||
"written");
|
||||
if ((uint64_t)DebugRanges.Offset < CurrOffset)
|
||||
return createStringError(errc::invalid_argument,
|
||||
"'Offset' for 'debug_ranges' with index " +
|
||||
Twine(EntryIndex) +
|
||||
" must be greater than or equal to the "
|
||||
"number of bytes written already (0x" +
|
||||
Twine::utohexstr(CurrOffset) + ")");
|
||||
if (DebugRanges.Offset > CurrOffset)
|
||||
ZeroFillBytes(OS, DebugRanges.Offset - CurrOffset);
|
||||
for (auto Entry : DebugRanges.Entries) {
|
||||
|
@ -141,6 +147,7 @@ Error DWARFYAML::emitDebugRanges(raw_ostream &OS, const DWARFYAML::Data &DI) {
|
|||
DI.IsLittleEndian);
|
||||
}
|
||||
ZeroFillBytes(OS, DebugRanges.AddrSize * 2);
|
||||
++EntryIndex;
|
||||
}
|
||||
|
||||
return Error::success();
|
||||
|
|
|
@ -313,3 +313,29 @@ FileHeader:
|
|||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
DWARF:
|
||||
|
||||
## i) Test that yaml2obj emits an error message if we try to assign an invalid offset to an
|
||||
## entry of the '.debug_ranges' section.
|
||||
|
||||
# RUN: not yaml2obj --docnum=9 %s -o %t9.o 2>&1 | FileCheck %s --check-prefix=INVALID-OFFSET
|
||||
|
||||
# INVALID-OFFSET: yaml2obj: error: 'Offset' for 'debug_ranges' with index 1 must be greater than or equal to the number of bytes written already (0x20)
|
||||
|
||||
--- !ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_EXEC
|
||||
Machine: EM_X86_64
|
||||
DWARF:
|
||||
debug_ranges:
|
||||
- Offset: 0x00
|
||||
AddrSize: 0x08
|
||||
Entries:
|
||||
- LowOffset: 0x01
|
||||
HighOffset: 0x02
|
||||
- Offset: 0x1F ## Must be greater than or equal to 0x20.
|
||||
AddrSize: 0x08
|
||||
Entries:
|
||||
- LowOffset: 0x01
|
||||
HighOffset: 0x02
|
||||
|
|
Loading…
Reference in New Issue