--- /dev/null
+; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj %s -o - | llvm-readobj -r -expand-relocs | FileCheck %s
+
+; Pointers to functions of two different types
+@a = global i64 ()* inttoptr (i64 5 to i64 ()*), align 8
+@b = global i32 ()* inttoptr (i32 7 to i32 ()*), align 8
+
+; External functions
+declare i32 @c()
+declare i32 @d()
+
+define i32 @f1() {
+entry:
+ %aa = load i64 ()*, i64 ()** @a, align 8
+ %bb = load i32 ()*, i32 ()** @b, align 8
+ %tmp1 = call i64 %aa()
+ %tmp2 = call i32 %bb()
+ %tmp3 = call i32 @c()
+ %tmp4 = call i32 @d()
+ ret i32 %tmp2
+}
+
+
+; CHECK: Format: WASM
+; CHECK: Relocations [
+; CHECK-NEXT: Section (8) CODE {
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Type: R_WEBASSEMBLY_GLOBAL_ADDR_LEB (3)
+; CHECK-NEXT: Offset: 0x9
+; CHECK-NEXT: Index: 0x0
+; CHECK-NEXT: Addend: 0
+; CHECK-NEXT: }
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Type: R_WEBASSEMBLY_GLOBAL_ADDR_LEB (3)
+; CHECK-NEXT: Offset: 0x14
+; CHECK-NEXT: Index: 0x1
+; CHECK-NEXT: Addend: 0
+; CHECK-NEXT: }
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB (0)
+; CHECK-NEXT: Offset: 0x2D
+; CHECK-NEXT: Index: 0x0
+; CHECK-NEXT: }
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Type: R_WEBASSEMBLY_FUNCTION_INDEX_LEB (0)
+; CHECK-NEXT: Offset: 0x34
+; CHECK-NEXT: Index: 0x1
+; CHECK-NEXT: }
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Type: R_WEBASSEMBLY_TYPE_INDEX_LEB (6)
+; CHECK-NEXT: Offset: 0x1A
+; CHECK-NEXT: Index: 0x1
+; CHECK-NEXT: }
+; CHECK-NEXT: Relocation {
+; CHECK-NEXT: Type: R_WEBASSEMBLY_TYPE_INDEX_LEB (6)
+; CHECK-NEXT: Offset: 0x24
+; CHECK-NEXT: Index: 0x0
+; CHECK-NEXT: }
+; CHECK-NEXT: }
+; CHECK-NEXT: ]
--- /dev/null
+; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj %s -o - | llvm-readobj -s | FileCheck %s
+
+; external function
+declare i32 @a()
+
+; global data
+@b = global i32 3, align 4
+
+; local function
+define i32 @f1() {
+entry:
+ %tmp1 = call i32 @a()
+ ret i32 %tmp1
+}
+
+
+; CHECK: Format: WASM
+; CHECK: Arch: wasm32
+; CHECK: AddressSize: 32bit
+; CHECK: Sections [
+; CHECK: Section {
+; CHECK: Type: TYPE (0x1)
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: IMPORT (0x2)
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: FUNCTION (0x3)
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: TABLE (0x4)
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: MEMORY (0x5)
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: GLOBAL (0x6)
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: EXPORT (0x7)
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: CODE (0xA)
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: DATA (0xB)
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: CUSTOM (0x0)
+; CHECK: Name: name
+; CHECK: }
+; CHECK: Section {
+; CHECK: Type: CUSTOM (0x0)
+; CHECK: Name: reloc.CODE
+; CHECK: }
+; CHECK:]
+
WASM-NEXT: Type: R_WEBASSEMBLY_TABLE_INDEX_SLEB (1)
WASM-NEXT: Offset: 0x6
WASM-NEXT: Index: 0x0
-WASM-NEXT: Addend: 0x0
WASM-NEXT: }
WASM-NEXT: Relocation {
WASM-NEXT: Type: R_WEBASSEMBLY_GLOBAL_ADDR_LEB (3)
WASM-NEXT: Offset: 0x15
WASM-NEXT: Index: 0x0
-WASM-NEXT: Addend: 0x0
+WASM-NEXT: Addend: 0
WASM-NEXT: }
WASM-NEXT: Relocation {
WASM-NEXT: Type: R_WEBASSEMBLY_GLOBAL_ADDR_LEB (3)
WASM-NEXT: Offset: 0x24
WASM-NEXT: Index: 0x1
-WASM-NEXT: Addend: 0x0
+WASM-NEXT: Addend: 0
WASM-NEXT: }
WASM-NEXT: }
WASM-NEXT: ]
Reloc.getTypeName(RelocTypeName);
const wasm::WasmRelocation &WasmReloc = Obj->getWasmRelocation(Reloc);
+ bool HasAddend = false;
+ switch (RelocType) {
+ case wasm::R_WEBASSEMBLY_GLOBAL_ADDR_LEB:
+ case wasm::R_WEBASSEMBLY_GLOBAL_ADDR_SLEB:
+ case wasm::R_WEBASSEMBLY_GLOBAL_ADDR_I32:
+ HasAddend = true;
+ break;
+ default:
+ break;
+ }
if (opts::ExpandRelocs) {
DictScope Group(W, "Relocation");
W.printNumber("Type", RelocTypeName, RelocType);
W.printHex("Offset", Reloc.getOffset());
W.printHex("Index", WasmReloc.Index);
- W.printHex("Addend", WasmReloc.Addend);
+ if (HasAddend)
+ W.printNumber("Addend", WasmReloc.Addend);
} else {
raw_ostream& OS = W.startLine();
OS << W.hex(Reloc.getOffset())
- << " " << RelocTypeName << "[" << WasmReloc.Index << "]"
- << " " << W.hex(WasmReloc.Addend) << "\n";
+ << " " << RelocTypeName << "[" << WasmReloc.Index << "]";
+ if (HasAddend)
+ OS << " " << WasmReloc.Addend;
+ OS << "\n";
}
}