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))
|
if (IsAddressTaken.count(&WS))
|
||||||
TableElems.push_back(Index);
|
TableElems.push_back(Index);
|
||||||
} else {
|
} else {
|
||||||
if (WS.getOffset() != 0)
|
if (WS.isTemporary() && !WS.getSize())
|
||||||
report_fatal_error("data sections must contain one variable each");
|
continue;
|
||||||
if (!WS.getSize())
|
|
||||||
report_fatal_error("data symbols must have a size set with .size");
|
|
||||||
|
|
||||||
int64_t Size = 0;
|
|
||||||
if (!WS.getSize()->evaluateAsAbsolute(Size, Layout))
|
|
||||||
report_fatal_error(".size expression must be evaluatable");
|
|
||||||
|
|
||||||
if (WS.isDefined(false)) {
|
if (WS.isDefined(false)) {
|
||||||
|
if (WS.getOffset() != 0)
|
||||||
|
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: " +
|
||||||
|
WS.getName());
|
||||||
|
|
||||||
|
int64_t Size = 0;
|
||||||
|
if (!WS.getSize()->evaluateAsAbsolute(Size, Layout))
|
||||||
|
report_fatal_error(".size expression must be evaluatable");
|
||||||
|
|
||||||
MCSectionWasm &DataSection =
|
MCSectionWasm &DataSection =
|
||||||
static_cast<MCSectionWasm &>(WS.getSection());
|
static_cast<MCSectionWasm &>(WS.getSection());
|
||||||
|
|
||||||
|
@ -88,6 +88,3 @@ pr45695.c wasm-o
|
|||||||
pr49279.c wasm-o
|
pr49279.c wasm-o
|
||||||
pr49390.c wasm-o
|
pr49390.c wasm-o
|
||||||
pr52286.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