mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[WebAssembly] MC: Fix references to undefined externals in data section
Undefined externals don't need to have a size or an offset. This was broken by r303915. Added a test for this case. This fixes the "Compile LLVM Torture (o)" step on the wasm waterfall. Differential Revision: https://reviews.llvm.org/D33803 llvm-svn: 304505
This commit is contained in:
parent
a23ff8f1c8
commit
077f4728a6
@ -730,16 +730,21 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
|
||||
if (IsAddressTaken.count(&WS))
|
||||
TableElems.push_back(Index);
|
||||
} else {
|
||||
if (WS.isTemporary() && !WS.getSize())
|
||||
continue;
|
||||
|
||||
if (WS.isDefined(false)) {
|
||||
if (WS.getOffset() != 0)
|
||||
report_fatal_error("data sections must contain one variable each");
|
||||
report_fatal_error("data sections must contain one variable each: " +
|
||||
WS.getName());
|
||||
if (!WS.getSize())
|
||||
report_fatal_error("data symbols must have a size set with .size");
|
||||
report_fatal_error("data symbols must have a size set with .size: " +
|
||||
WS.getName());
|
||||
|
||||
int64_t Size = 0;
|
||||
if (!WS.getSize()->evaluateAsAbsolute(Size, Layout))
|
||||
report_fatal_error(".size expression must be evaluatable");
|
||||
|
||||
if (WS.isDefined(false)) {
|
||||
MCSectionWasm &DataSection =
|
||||
static_cast<MCSectionWasm &>(WS.getSection());
|
||||
|
||||
|
@ -88,6 +88,3 @@ pr45695.c wasm-o
|
||||
pr49279.c wasm-o
|
||||
pr49390.c wasm-o
|
||||
pr52286.c wasm-o
|
||||
|
||||
# fatal error: error in backend: data symbols must have a size set with .size
|
||||
921110-1.c wasm-o
|
||||
|
21
test/MC/WebAssembly/external-data.ll
Normal file
21
test/MC/WebAssembly/external-data.ll
Normal file
@ -0,0 +1,21 @@
|
||||
; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj %s -o - | obj2yaml | FileCheck %s
|
||||
; Verify relocations are correctly generated for addresses of externals
|
||||
; in the data section.
|
||||
|
||||
declare i32 @f1(...)
|
||||
|
||||
@foo = global i64 7, align 4
|
||||
@far = local_unnamed_addr global i32 (...)* @f1, align 4
|
||||
|
||||
; CHECK: - Type: DATA
|
||||
; CHECK: Relocations:
|
||||
; CHECK: - Type: R_WEBASSEMBLY_GLOBAL_ADDR_I32
|
||||
; CHECK: Index: 0
|
||||
; CHECK: Offset: 0x0000000E
|
||||
; CHECK: Segments:
|
||||
; CHECK: - Index: 0
|
||||
; CHECK: Offset:
|
||||
; CHECK: Opcode: I32_CONST
|
||||
; CHECK: Value: 0
|
||||
; CHECK: Content: 0700000000000000FFFFFFFF
|
||||
|
Loading…
Reference in New Issue
Block a user