mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +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