[llvm] r303915 - [WebAssembly] MC: Include unnamed data when writing wasm files
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Thu May 25 14:08:07 PDT 2017
Author: sbc
Date: Thu May 25 16:08:07 2017
New Revision: 303915
URL: http://llvm.org/viewvc/llvm-project?rev=303915&view=rev
Log:
[WebAssembly] MC: Include unnamed data when writing wasm files
Also, include global entries for all data symbols, not
just external ones, since these are referenced by the
relocation records.
Add a test case that includes unnamed data.
Differential Revision: https://reviews.llvm.org/D33079
Added:
llvm/trunk/test/MC/WebAssembly/unnamed-data.ll
Modified:
llvm/trunk/lib/MC/WasmObjectWriter.cpp
Modified: llvm/trunk/lib/MC/WasmObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WasmObjectWriter.cpp?rev=303915&r1=303914&r2=303915&view=diff
==============================================================================
--- llvm/trunk/lib/MC/WasmObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/WasmObjectWriter.cpp Thu May 25 16:08:07 2017
@@ -422,6 +422,7 @@ static void ApplyRelocations(
RelEntry.Offset;
switch (RelEntry.Type) {
case wasm::R_WEBASSEMBLY_FUNCTION_INDEX_LEB: {
+ assert(SymbolIndices.count(RelEntry.Symbol));
uint32_t Index = SymbolIndices[RelEntry.Symbol];
assert(RelEntry.Addend == 0);
@@ -429,6 +430,7 @@ static void ApplyRelocations(
break;
}
case wasm::R_WEBASSEMBLY_TABLE_INDEX_SLEB: {
+ assert(SymbolIndices.count(RelEntry.Symbol));
uint32_t Index = SymbolIndices[RelEntry.Symbol];
assert(RelEntry.Addend == 0);
@@ -448,6 +450,7 @@ static void ApplyRelocations(
break;
}
case wasm::R_WEBASSEMBLY_TABLE_INDEX_I32: {
+ assert(SymbolIndices.count(RelEntry.Symbol));
uint32_t Index = SymbolIndices[RelEntry.Symbol];
assert(RelEntry.Addend == 0);
@@ -478,6 +481,7 @@ WriteRelocations(ArrayRef<WasmRelocation
uint64_t Offset = RelEntry.Offset +
RelEntry.FixupSection->getSectionOffset() + HeaderSize;
+ assert(SymbolIndices.count(RelEntry.Symbol));
uint32_t Index = SymbolIndices[RelEntry.Symbol];
int64_t Addend = RelEntry.Addend;
@@ -726,10 +730,6 @@ void WasmObjectWriter::writeObject(MCAss
if (IsAddressTaken.count(&WS))
TableElems.push_back(Index);
} else {
- // For now, ignore temporary non-function symbols.
- if (S.isTemporary())
- continue;
-
if (WS.getOffset() != 0)
report_fatal_error("data sections must contain one variable each");
if (!WS.getSize())
@@ -777,20 +777,18 @@ void WasmObjectWriter::writeObject(MCAss
}
}
- // For each external global, prepare a corresponding wasm global
- // holding its address.
- if (WS.isExternal()) {
- Index = NumGlobalImports + Globals.size();
-
- WasmGlobal Global;
- Global.Type = PtrType;
- Global.IsMutable = false;
- Global.HasImport = false;
- Global.InitialValue = DataSection.getSectionOffset();
- Global.ImportIndex = 0;
- SymbolIndices[&WS] = Index;
- Globals.push_back(Global);
- }
+ // For each global, prepare a corresponding wasm global holding its
+ // address. For externals these will also be named exports.
+ Index = NumGlobalImports + Globals.size();
+
+ WasmGlobal Global;
+ Global.Type = PtrType;
+ Global.IsMutable = false;
+ Global.HasImport = false;
+ Global.InitialValue = DataSection.getSectionOffset();
+ Global.ImportIndex = 0;
+ SymbolIndices[&WS] = Index;
+ Globals.push_back(Global);
}
}
Added: llvm/trunk/test/MC/WebAssembly/unnamed-data.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/WebAssembly/unnamed-data.ll?rev=303915&view=auto
==============================================================================
--- llvm/trunk/test/MC/WebAssembly/unnamed-data.ll (added)
+++ llvm/trunk/test/MC/WebAssembly/unnamed-data.ll Thu May 25 16:08:07 2017
@@ -0,0 +1,53 @@
+; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj %s -o - | obj2yaml | FileCheck %s
+
+ at .str1 = private unnamed_addr constant [6 x i8] c"hello\00", align 1
+ at .str2 = private unnamed_addr constant [6 x i8] c"world\00", align 1
+
+ at a = global i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str1, i32 0, i32 0), align 8
+ at b = global i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str2, i32 0, i32 0), align 8
+
+
+; CHECK: - Type: GLOBAL
+; CHECK: Globals:
+; CHECK: - Type: I32
+; CHECK: Mutable: false
+; CHECK: InitExpr:
+; CHECK: Opcode: I32_CONST
+; CHECK: Value: 0
+; CHECK: - Type: I32
+; CHECK: Mutable: false
+; CHECK: InitExpr:
+; CHECK: Opcode: I32_CONST
+; CHECK: Value: 6
+; CHECK: - Type: I32
+; CHECK: Mutable: false
+; CHECK: InitExpr:
+; CHECK: Opcode: I32_CONST
+; CHECK: Value: 16
+; CHECK: - Type: I32
+; CHECK: Mutable: false
+; CHECK: InitExpr:
+; CHECK: Opcode: I32_CONST
+; CHECK: Value: 24
+; CHECK: - Type: EXPORT
+; CHECK: Exports:
+; CHECK: - Name: a
+; CHECK: Kind: GLOBAL
+; CHECK: Index: 2
+; CHECK: - Name: b
+; CHECK: Kind: GLOBAL
+; CHECK: Index: 3
+; CHECK: - Type: DATA
+; CHECK: Relocations:
+; CHECK: - Type: R_WEBASSEMBLY_GLOBAL_ADDR_I32
+; CHECK: Index: 0
+; CHECK: Offset: 0x00000016
+; CHECK: - Type: R_WEBASSEMBLY_GLOBAL_ADDR_I32
+; CHECK: Index: 1
+; CHECK: Offset: 0x0000001E
+; CHECK: Segments:
+; CHECK: - Index: 0
+; CHECK: Offset:
+; CHECK: Opcode: I32_CONST
+; CHECK: Value: 0
+; CHECK: Content: 68656C6C6F00776F726C640000000000000000000000000006000000
More information about the llvm-commits
mailing list