forked from OSchip/llvm-project
[mach-o] Fix so that mach-o semantic errors return an error rather than assert
llvm-svn: 209469
This commit is contained in:
parent
d3b4e08960
commit
8a0bc44b71
|
@ -107,8 +107,8 @@ static void processUndefindeSymbol(MachOFile &file, const Symbol &sym,
|
|||
}
|
||||
}
|
||||
|
||||
static void processSection(MachOFile &file, const Section §ion,
|
||||
bool copyRefs) {
|
||||
static error_code processSection(MachOFile &file, const Section §ion,
|
||||
bool copyRefs) {
|
||||
unsigned offset = 0;
|
||||
switch (section.type) {
|
||||
case llvm::MachO::S_REGULAR:
|
||||
|
@ -128,7 +128,8 @@ static void processSection(MachOFile &file, const Section §ion,
|
|||
}
|
||||
break;
|
||||
case llvm::MachO::S_4BYTE_LITERALS:
|
||||
assert((section.content.size() % 4) == 0);
|
||||
if ((section.content.size() % 4) != 0)
|
||||
return llvm::make_error_code(llvm::errc::executable_format_error);
|
||||
for (size_t i = 0, e = section.content.size(); i != e; i += 4) {
|
||||
ArrayRef<uint8_t> byteContent = section.content.slice(offset, 4);
|
||||
file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit,
|
||||
|
@ -137,7 +138,8 @@ static void processSection(MachOFile &file, const Section §ion,
|
|||
}
|
||||
break;
|
||||
case llvm::MachO::S_8BYTE_LITERALS:
|
||||
assert((section.content.size() % 8) == 0);
|
||||
if ((section.content.size() % 8) != 0)
|
||||
return llvm::make_error_code(llvm::errc::executable_format_error);
|
||||
for (size_t i = 0, e = section.content.size(); i != e; i += 8) {
|
||||
ArrayRef<uint8_t> byteContent = section.content.slice(offset, 8);
|
||||
file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit,
|
||||
|
@ -146,7 +148,8 @@ static void processSection(MachOFile &file, const Section §ion,
|
|||
}
|
||||
break;
|
||||
case llvm::MachO::S_16BYTE_LITERALS:
|
||||
assert((section.content.size() % 16) == 0);
|
||||
if ((section.content.size() % 16) != 0)
|
||||
return llvm::make_error_code(llvm::errc::executable_format_error);
|
||||
for (size_t i = 0, e = section.content.size(); i != e; i += 16) {
|
||||
ArrayRef<uint8_t> byteContent = section.content.slice(offset, 16);
|
||||
file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit,
|
||||
|
@ -155,9 +158,10 @@ static void processSection(MachOFile &file, const Section §ion,
|
|||
}
|
||||
break;
|
||||
default:
|
||||
llvm_unreachable("mach-o section type not supported");
|
||||
llvm_unreachable("mach-o section type not supported yet");
|
||||
break;
|
||||
}
|
||||
return error_code::success();
|
||||
}
|
||||
|
||||
static ErrorOr<std::unique_ptr<lld::File>>
|
||||
|
@ -179,7 +183,8 @@ normalizedObjectToAtoms(const NormalizedFile &normalizedFile, StringRef path,
|
|||
}
|
||||
// Create atoms from sections that don't have symbols.
|
||||
for (auto § : normalizedFile.sections) {
|
||||
processSection(*file, sect, copyRefs);
|
||||
if (error_code ec = processSection(*file, sect, copyRefs))
|
||||
return ec;
|
||||
}
|
||||
|
||||
return std::unique_ptr<File>(std::move(file));
|
||||
|
|
|
@ -659,8 +659,10 @@ bool MachOYamlIOTaggedDocumentHandler::handledDocTag(llvm::yaml::IO &io,
|
|||
std::unique_ptr<lld::File> f = std::move(foe.get());
|
||||
file = f.release();
|
||||
return true;
|
||||
} else {
|
||||
io.setError(foe.getError().message());
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
# RUN: not lld -flavor darwin -arch x86_64 -r -print_atoms %s -o %t 2> %t.err
|
||||
# RUN: FileCheck %s < %t.err
|
||||
#
|
||||
# Test for error if literal section is not correct size mulitple.
|
||||
#
|
||||
|
||||
--- !mach-o
|
||||
arch: x86_64
|
||||
file-type: MH_OBJECT
|
||||
flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
|
||||
has-UUID: false
|
||||
OS: unknown
|
||||
sections:
|
||||
- segment: __TEXT
|
||||
section: __literal8
|
||||
type: S_8BYTE_LITERALS
|
||||
attributes: [ ]
|
||||
alignment: 0
|
||||
address: 0x0000000000000120
|
||||
content: [ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
|
||||
0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D ]
|
||||
...
|
||||
|
||||
# CHECK: error:
|
||||
|
Loading…
Reference in New Issue