mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-27 09:17:11 +00:00
Fix a Mach-O assembler segfault for a subtraction expression with an undefined symbol.
In a Mach-O object file a relocatable expression of the form SymbolA - SymbolB + constant is allowed when both symbols are defined in a section. But when either symbol is undefined it is an error. The code was crashing when it had an undefined symbol in this case. And should have printed a error message using the location information in the relocation entry. rdar://18678402 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220599 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -179,11 +179,14 @@ void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
|
|||||||
if (A_Base == B_Base && A_Base)
|
if (A_Base == B_Base && A_Base)
|
||||||
report_fatal_error("unsupported relocation with identical base", false);
|
report_fatal_error("unsupported relocation with identical base", false);
|
||||||
|
|
||||||
// A subtraction expression where both symbols are undefined is a
|
// A subtraction expression where either symbol is undefined is a
|
||||||
// non-relocatable expression.
|
// non-relocatable expression.
|
||||||
if (A->isUndefined() && B->isUndefined())
|
if (A->isUndefined() || B->isUndefined()) {
|
||||||
report_fatal_error("unsupported relocation with subtraction expression",
|
StringRef Name = A->isUndefined() ? A->getName() : B->getName();
|
||||||
false);
|
Asm.getContext().FatalError(Fixup.getLoc(),
|
||||||
|
"unsupported relocation with subtraction expression, symbol '" +
|
||||||
|
Name + "' can not be undefined in a subtraction expression");
|
||||||
|
}
|
||||||
|
|
||||||
Value += Writer->getSymbolAddress(&A_SD, Layout) -
|
Value += Writer->getSymbolAddress(&A_SD, Layout) -
|
||||||
(!A_Base ? 0 : Writer->getSymbolAddress(A_Base, Layout));
|
(!A_Base ? 0 : Writer->getSymbolAddress(A_Base, Layout));
|
||||||
|
|||||||
6
test/MC/MachO/bad-darwin-x86_64-reloc-expr1.s
Normal file
6
test/MC/MachO/bad-darwin-x86_64-reloc-expr1.s
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
// RUN: not llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o - 2> %t.err > %t
|
||||||
|
// RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s
|
||||||
|
|
||||||
|
_Z:
|
||||||
|
.long (_Z+4)-_b
|
||||||
|
// CHECK-ERROR: error: unsupported relocation with subtraction expression, symbol '_b' can not be undefined in a subtraction expression
|
||||||
6
test/MC/MachO/bad-darwin-x86_64-reloc-expr2.s
Normal file
6
test/MC/MachO/bad-darwin-x86_64-reloc-expr2.s
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
// RUN: not llvm-mc -triple x86_64-apple-darwin10 %s -filetype=obj -o - 2> %t.err > %t
|
||||||
|
// RUN: FileCheck --check-prefix=CHECK-ERROR < %t.err %s
|
||||||
|
|
||||||
|
_Z:
|
||||||
|
.long (_a+4)-_Z
|
||||||
|
// CHECK-ERROR: error: unsupported relocation with subtraction expression, symbol '_a' can not be undefined in a subtraction expression
|
||||||
Reference in New Issue
Block a user