#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"
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) {
DI.IsLittleEndian);
}
ZeroFillBytes(OS, DebugRanges.AddrSize * 2);
+ ++EntryIndex;
}
return Error::success();
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