[lld] r372284 - [WebAssembly] Sort output data sections to place .bss last
Thomas Lively via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 18 18:14:59 PDT 2019
Author: tlively
Date: Wed Sep 18 18:14:59 2019
New Revision: 372284
URL: http://llvm.org/viewvc/llvm-project?rev=372284&view=rev
Log:
[WebAssembly] Sort output data sections to place .bss last
Summary:
This was always the intended behavior, but had not been
implemented. This ordering is important for Emscripten when generating
.mem files while compiling to JS, since only zeros at the end of
initialized memory can be dropped.
Fixes https://github.com/emscripten-core/emscripten/issues/8999
Reviewers: sbc100
Subscribers: dschuff, jgravelle-google, aheejin, sunfish, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D67736
Added:
lld/trunk/test/wasm/custom-section-name.ll
Modified:
lld/trunk/test/wasm/data-layout.ll
lld/trunk/test/wasm/data-segment-merging.ll
lld/trunk/test/wasm/data-segments.ll
lld/trunk/test/wasm/reloc-addend.ll
lld/trunk/test/wasm/relocatable.ll
lld/trunk/test/wasm/tls-align.ll
lld/trunk/test/wasm/tls.ll
lld/trunk/wasm/OutputSegment.h
lld/trunk/wasm/Writer.cpp
Added: lld/trunk/test/wasm/custom-section-name.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/custom-section-name.ll?rev=372284&view=auto
==============================================================================
--- lld/trunk/test/wasm/custom-section-name.ll (added)
+++ lld/trunk/test/wasm/custom-section-name.ll Wed Sep 18 18:14:59 2019
@@ -0,0 +1,58 @@
+; RUN: llc -filetype=obj %s -o %t.o
+; RUN: wasm-ld -no-gc-sections --no-entry -o %t.wasm %t.o
+; RUN: obj2yaml %t.wasm | FileCheck %s
+; RUN: wasm-ld -no-gc-sections --no-entry -o %t_reloc.o %t.o --relocatable
+; RUN: obj2yaml %t_reloc.o | FileCheck -check-prefix RELOC %s
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+ at bss = hidden global i32 zeroinitializer, align 4
+ at foo = hidden global i32 zeroinitializer, section "WowZero!", align 4
+ at bar = hidden constant i32 42, section "MyAwesomeSection", align 4
+ at baz = hidden global i32 7, section "AnotherGreatSection", align 4
+
+; CHECK-LABEL: - Type: DATA
+; CHECK-NEXT: Segments:
+; CHECK-NEXT: - SectionOffset: 7
+; CHECK-NEXT: InitFlags: 0
+; CHECK-NEXT: Offset:
+; CHECK-NEXT: Opcode: I32_CONST
+; CHECK-NEXT: Value: 1024
+; CHECK-NEXT: Content: '00000000'
+; CHECK-NEXT: - SectionOffset: 17
+; CHECK-NEXT: InitFlags: 0
+; CHECK-NEXT: Offset:
+; CHECK-NEXT: Opcode: I32_CONST
+; CHECK-NEXT: Value: 1028
+; CHECK-NEXT: Content: 2A000000
+; CHECK-NEXT: - SectionOffset: 27
+; CHECK-NEXT: InitFlags: 0
+; CHECK-NEXT: Offset:
+; CHECK-NEXT: Opcode: I32_CONST
+; CHECK-NEXT: Value: 1032
+; CHECK-NEXT: Content: '07000000'
+; CHECK-NEXT: - SectionOffset: 37
+; CHECK-NEXT: InitFlags: 0
+; CHECK-NEXT: Offset:
+; CHECK-NEXT: Opcode: I32_CONST
+; CHECK-NEXT: Value: 1036
+; CHECK-NEXT: Content: '00000000'
+
+; RELOC-LABEL: SegmentInfo:
+; RELOC-NEXT: - Index: 0
+; RELOC-NEXT: Name: 'WowZero!'
+; RELOC-NEXT: Alignment: 2
+; RELOC-NEXT: Flags: [ ]
+; RELOC-NEXT: - Index: 1
+; RELOC-NEXT: Name: MyAwesomeSection
+; RELOC-NEXT: Alignment: 2
+; RELOC-NEXT: Flags: [ ]
+; RELOC-NEXT: - Index: 2
+; RELOC-NEXT: Name: AnotherGreatSection
+; RELOC-NEXT: Alignment: 2
+; RELOC-NEXT: Flags: [ ]
+; RELOC-NEXT: - Index: 3
+; RELOC-NEXT: Name: .bss.bss
+; RELOC-NEXT: Alignment: 2
+; RELOC-NEXT: Flags: [ ]
Modified: lld/trunk/test/wasm/data-layout.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/data-layout.ll?rev=372284&r1=372283&r2=372284&view=diff
==============================================================================
--- lld/trunk/test/wasm/data-layout.ll (original)
+++ lld/trunk/test/wasm/data-layout.ll Wed Sep 18 18:14:59 2019
@@ -26,19 +26,19 @@ target triple = "wasm32-unknown-unknown"
; CHECK-NEXT: Mutable: true
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 66608
+; CHECK-NEXT: Value: 66624
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Type: I32
; CHECK-NEXT: Mutable: false
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 1071
+; CHECK-NEXT: Value: 1080
; CHECK-NEXT: - Index: 2
; CHECK-NEXT: Type: I32
; CHECK-NEXT: Mutable: false
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 66608
+; CHECK-NEXT: Value: 66624
; CHECK: - Type: DATA
; CHECK-NEXT: Segments:
@@ -47,19 +47,19 @@ target triple = "wasm32-unknown-unknown"
; CHECK-NEXT: Offset:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 1024
-; CHECK-NEXT: Content: '0100000000000000000000000000000003000000000000002804000024040000'
-; CHECK-NEXT: - SectionOffset: 45
+; CHECK-NEXT: Content: 68656C6C6F0A00
+; CHECK-NEXT: - SectionOffset: 20
; CHECK-NEXT: InitFlags: 0
; CHECK-NEXT: Offset:
; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 1056
-; CHECK-NEXT: Content: '0000000000000000'
-; CHECK-NEXT: - SectionOffset: 59
+; CHECK-NEXT: Value: 1040
+; CHECK-NEXT: Content: '0100000000000000000000000000000003000000000000000004000034040000'
+; CHECK-NEXT: - SectionOffset: 58
; CHECK-NEXT: InitFlags: 0
; CHECK-NEXT: Offset:
; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 1064
-; CHECK-NEXT: Content: 68656C6C6F0A00
+; CHECK-NEXT: Value: 1072
+; CHECK-NEXT: Content: '0000000000000000'
; CHECK-NEXT: - Type: CUSTOM
@@ -92,10 +92,10 @@ target triple = "wasm32-unknown-unknown"
; RELOC-NEXT: Relocations:
; RELOC-NEXT: - Type: R_WASM_MEMORY_ADDR_I32
; RELOC-NEXT: Index: 3
-; RELOC-NEXT: Offset: 0x00000018
+; RELOC-NEXT: Offset: 0x00000024
; RELOC-NEXT: - Type: R_WASM_MEMORY_ADDR_I32
; RELOC-NEXT: Index: 4
-; RELOC-NEXT: Offset: 0x0000002E
+; RELOC-NEXT: Offset: 0x0000002D
; RELOC-NEXT: Addend: 4
; RELOC-NEXT: Segments:
; RELOC-NEXT: - SectionOffset: 6
@@ -103,60 +103,60 @@ target triple = "wasm32-unknown-unknown"
; RELOC-NEXT: Offset:
; RELOC-NEXT: Opcode: I32_CONST
; RELOC-NEXT: Value: 0
+; RELOC-NEXT: Content: 68656C6C6F0A00
+; RELOC-NEXT: - SectionOffset: 18
+; RELOC-NEXT: InitFlags: 0
+; RELOC-NEXT: Offset:
+; RELOC-NEXT: Opcode: I32_CONST
+; RELOC-NEXT: Value: 8
; RELOC-NEXT: Content: '01000000'
-; RELOC-NEXT: - SectionOffset: 15
+; RELOC-NEXT: - SectionOffset: 27
; RELOC-NEXT: InitFlags: 0
; RELOC-NEXT: Offset:
; RELOC-NEXT: Opcode: I32_CONST
; RELOC-NEXT: Value: 16
; RELOC-NEXT: Content: '03000000'
-; RELOC-NEXT: - SectionOffset: 24
+; RELOC-NEXT: - SectionOffset: 36
; RELOC-NEXT: InitFlags: 0
; RELOC-NEXT: Offset:
; RELOC-NEXT: Opcode: I32_CONST
; RELOC-NEXT: Value: 24
-; RELOC-NEXT: Content: '28000000'
-; RELOC-NEXT: - SectionOffset: 33
+; RELOC-NEXT: Content: '00000000'
+; RELOC-NEXT: - SectionOffset: 45
; RELOC-NEXT: InitFlags: 0
; RELOC-NEXT: Offset:
; RELOC-NEXT: Opcode: I32_CONST
; RELOC-NEXT: Value: 28
-; RELOC-NEXT: Content: '0000000000000000'
-; RELOC-NEXT: - SectionOffset: 46
-; RELOC-NEXT: InitFlags: 0
-; RELOC-NEXT: Offset:
-; RELOC-NEXT: Opcode: I32_CONST
-; RELOC-NEXT: Value: 36
-; RELOC-NEXT: Content: '20000000'
-; RELOC-NEXT: - SectionOffset: 55
+; RELOC-NEXT: Content: '24000000'
+; RELOC-NEXT: - SectionOffset: 54
; RELOC-NEXT: InitFlags: 0
; RELOC-NEXT: Offset:
; RELOC-NEXT: Opcode: I32_CONST
-; RELOC-NEXT: Value: 40
-; RELOC-NEXT: Content: 68656C6C6F0A00
+; RELOC-NEXT: Value: 32
+; RELOC-NEXT: Content: '0000000000000000'
; RELOC: SymbolTable:
; RELOC-NEXT: - Index: 0
; RELOC-NEXT: Kind: DATA
; RELOC-NEXT: Name: foo
; RELOC-NEXT: Flags: [ VISIBILITY_HIDDEN ]
-; RELOC-NEXT: Segment: 0
+; RELOC-NEXT: Segment: 1
; RELOC-NEXT: Size: 4
; RELOC-NEXT: - Index: 1
; RELOC-NEXT: Kind: DATA
; RELOC-NEXT: Name: aligned_bar
; RELOC-NEXT: Flags: [ VISIBILITY_HIDDEN ]
-; RELOC-NEXT: Segment: 1
+; RELOC-NEXT: Segment: 2
; RELOC-NEXT: Size: 4
; RELOC-NEXT: - Index: 2
; RELOC-NEXT: Kind: DATA
; RELOC-NEXT: Name: external_ref
; RELOC-NEXT: Flags: [ ]
-; RELOC-NEXT: Segment: 2
+; RELOC-NEXT: Segment: 3
; RELOC-NEXT: Size: 4
; RELOC-NEXT: - Index: 3
; RELOC-NEXT: Kind: DATA
; RELOC-NEXT: Name: hello_str
; RELOC-NEXT: Flags: [ ]
-; RELOC-NEXT: Segment: 5
+; RELOC-NEXT: Segment: 0
; RELOC-NEXT: Size: 7
Modified: lld/trunk/test/wasm/data-segment-merging.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/data-segment-merging.ll?rev=372284&r1=372283&r2=372284&view=diff
==============================================================================
--- lld/trunk/test/wasm/data-segment-merging.ll (original)
+++ lld/trunk/test/wasm/data-segment-merging.ll Wed Sep 18 18:14:59 2019
@@ -19,11 +19,11 @@ target triple = "wasm32-unknown-unknown"
; MERGE-NEXT: - SectionOffset: 7
; MERGE-NEXT: InitFlags: 0
; MERGE-NEXT: Offset:
-; MERGE: Content: 68656C6C6F00676F6F6462796500776861746576657200002A000000
-; MERGE-NEXT: - SectionOffset: 41
+; MERGE: Content: 636F6E7374616E74000000002B
+; MERGE-NEXT: - SectionOffset: 26
; MERGE-NEXT: InitFlags: 0
; MERGE-NEXT: Offset:
-; MERGE: Content: 636F6E7374616E74000000002B
+; MERGE: Content: 68656C6C6F00676F6F6462796500776861746576657200002A000000
; MERGE-NEXT: - Type: CUSTOM
; MERGE-NEXT: Name: name
; MERGE-NEXT: FunctionNames:
@@ -40,27 +40,27 @@ target triple = "wasm32-unknown-unknown"
; SEPARATE-NEXT: - SectionOffset: 7
; SEPARATE-NEXT: InitFlags: 0
; SEPARATE-NEXT: Offset:
-; SEPARATE: Content: 68656C6C6F00
-; SEPARATE-NEXT: - SectionOffset: 19
+; SEPARATE: Content: 636F6E7374616E7400
+; SEPARATE-NEXT: - SectionOffset: 22
; SEPARATE-NEXT: InitFlags: 0
; SEPARATE-NEXT: Offset:
-; SEPARATE: Content: 676F6F6462796500
-; SEPARATE-NEXT: - SectionOffset: 33
+; SEPARATE: Content: 2B
+; SEPARATE-NEXT: - SectionOffset: 29
; SEPARATE-NEXT: InitFlags: 0
; SEPARATE-NEXT: Offset:
-; SEPARATE: Content: '776861746576657200'
-; SEPARATE-NEXT: - SectionOffset: 48
+; SEPARATE: Content: 68656C6C6F00
+; SEPARATE-NEXT: - SectionOffset: 41
; SEPARATE-NEXT: InitFlags: 0
; SEPARATE-NEXT: Offset:
-; SEPARATE: Content: 2A000000
-; SEPARATE-NEXT: - SectionOffset: 58
+; SEPARATE: Content: 676F6F6462796500
+; SEPARATE-NEXT: - SectionOffset: 55
; SEPARATE-NEXT: InitFlags: 0
; SEPARATE-NEXT: Offset:
-; SEPARATE: Content: 636F6E7374616E7400
-; SEPARATE-NEXT: - SectionOffset: 73
+; SEPARATE: Content: '776861746576657200'
+; SEPARATE-NEXT: - SectionOffset: 70
; SEPARATE-NEXT: InitFlags: 0
; SEPARATE-NEXT: Offset:
-; SEPARATE: Content: 2B
+; SEPARATE: Content: 2A000000
; SEPARATE-NEXT: - Type: CUSTOM
; SEPARATE-NEXT: Name: name
; SEPARATE-NEXT: FunctionNames:
@@ -77,10 +77,10 @@ target triple = "wasm32-unknown-unknown"
; PASSIVE-MERGE-NEXT: Segments:
; PASSIVE-MERGE-NEXT: - SectionOffset: 3
; PASSIVE-MERGE-NEXT: InitFlags: 1
-; PASSIVE-MERGE-NEXT: Content: 68656C6C6F00676F6F6462796500776861746576657200002A000000
-; PASSIVE-MERGE-NEXT: - SectionOffset: 33
-; PASSIVE-MERGE-NEXT: InitFlags: 1
; PASSIVE-MERGE-NEXT: Content: 636F6E7374616E74000000002B
+; PASSIVE-MERGE-NEXT: - SectionOffset: 18
+; PASSIVE-MERGE-NEXT: InitFlags: 1
+; PASSIVE-MERGE-NEXT: Content: 68656C6C6F00676F6F6462796500776861746576657200002A000000
; PASSIVE-MERGE-NEXT: - Type: CUSTOM
; PASSIVE-MERGE-NEXT: Name: name
; PASSIVE-MERGE-NEXT: FunctionNames:
@@ -100,22 +100,22 @@ target triple = "wasm32-unknown-unknown"
; PASSIVE-SEPARATE-NEXT: Segments:
; PASSIVE-SEPARATE-NEXT: - SectionOffset: 3
; PASSIVE-SEPARATE-NEXT: InitFlags: 1
+; PASSIVE-SEPARATE-NEXT: Content: 636F6E7374616E7400
+; PASSIVE-SEPARATE-NEXT: - SectionOffset: 14
+; PASSIVE-SEPARATE-NEXT: InitFlags: 1
+; PASSIVE-SEPARATE-NEXT: Content: 2B
+; PASSIVE-SEPARATE-NEXT: - SectionOffset: 17
+; PASSIVE-SEPARATE-NEXT: InitFlags: 1
; PASSIVE-SEPARATE-NEXT: Content: 68656C6C6F00
-; PASSIVE-SEPARATE-NEXT: - SectionOffset: 11
+; PASSIVE-SEPARATE-NEXT: - SectionOffset: 25
; PASSIVE-SEPARATE-NEXT: InitFlags: 1
; PASSIVE-SEPARATE-NEXT: Content: 676F6F6462796500
-; PASSIVE-SEPARATE-NEXT: - SectionOffset: 21
+; PASSIVE-SEPARATE-NEXT: - SectionOffset: 35
; PASSIVE-SEPARATE-NEXT: InitFlags: 1
; PASSIVE-SEPARATE-NEXT: Content: '776861746576657200'
-; PASSIVE-SEPARATE-NEXT: - SectionOffset: 32
+; PASSIVE-SEPARATE-NEXT: - SectionOffset: 46
; PASSIVE-SEPARATE-NEXT: InitFlags: 1
; PASSIVE-SEPARATE-NEXT: Content: 2A000000
-; PASSIVE-SEPARATE-NEXT: - SectionOffset: 38
-; PASSIVE-SEPARATE-NEXT: InitFlags: 1
-; PASSIVE-SEPARATE-NEXT: Content: 636F6E7374616E7400
-; PASSIVE-SEPARATE-NEXT: - SectionOffset: 49
-; PASSIVE-SEPARATE-NEXT: InitFlags: 1
-; PASSIVE-SEPARATE-NEXT: Content: 2B
; PASSIVE-SEPARATE-NEXT: - Type: CUSTOM
; PASSIVE-SEPARATE-NEXT: Name: name
; PASSIVE-SEPARATE-NEXT: FunctionNames:
Modified: lld/trunk/test/wasm/data-segments.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/data-segments.ll?rev=372284&r1=372283&r2=372284&view=diff
==============================================================================
--- lld/trunk/test/wasm/data-segments.ll (original)
+++ lld/trunk/test/wasm/data-segments.ll Wed Sep 18 18:14:59 2019
@@ -37,20 +37,20 @@ target triple = "wasm32-unknown-unknown"
; ACTIVE-NEXT: Offset:
; ACTIVE-NEXT: Opcode: I32_CONST
; ACTIVE-NEXT: Value: 1024
-; ACTIVE-NEXT: Content: 68656C6C6F00676F6F646279650000002A000000
-; ACTIVE-NEXT: - SectionOffset: 34
+; ACTIVE-NEXT: Content: 636F6E7374616E74000000002B
+; ACTIVE-NEXT: - SectionOffset: 26
; ACTIVE-NEXT: InitFlags: 0
; ACTIVE-NEXT: Offset:
; ACTIVE-NEXT: Opcode: I32_CONST
-; ACTIVE-NEXT: Value: 1044
-; ACTIVE-NEXT: Content: '0000000000
-; ACTIVE-SAME: 0000000000'
-; ACTIVE-NEXT: - SectionOffset: 10041
+; ACTIVE-NEXT: Value: 1040
+; ACTIVE-NEXT: Content: 68656C6C6F00676F6F646279650000002A000000
+; ACTIVE-NEXT: - SectionOffset: 53
; ACTIVE-NEXT: InitFlags: 0
; ACTIVE-NEXT: Offset:
; ACTIVE-NEXT: Opcode: I32_CONST
-; ACTIVE-NEXT: Value: 11044
-; ACTIVE-NEXT: Content: 636F6E7374616E74000000002B
+; ACTIVE-NEXT: Value: 1060
+; ACTIVE-NEXT: Content: '0000000000
+; ACTIVE-SAME: 0000000000'
; ACTIVE-NEXT: - Type: CUSTOM
; ACTIVE-NEXT: Name: name
; ACTIVE-NEXT: FunctionNames:
@@ -66,7 +66,7 @@ target triple = "wasm32-unknown-unknown"
; PASSIVE-NEXT: Body: 0B
; PASSIVE-NEXT: - Index: 1
; PASSIVE-NEXT: Locals: []
-; PASSIVE-NEXT: Body: 41B4D60041004101FE480200044041B4D6004101427FFE0102001A0541800841004114FC08000041940841004190CE00FC08010041A4D6004100410DFC08020041B4D6004102FE17020041B4D600417FFE0002001A0BFC0900FC0901FC09020B
+; PASSIVE-NEXT: Body: 41B4D60041004101FE480200044041B4D6004101427FFE0102001A054180084100410DFC08000041900841004114FC08010041A40841004190CE00FC08020041B4D6004102FE17020041B4D600417FFE0002001A0BFC0900FC0901FC09020B
; PASSIVE-NEXT: - Index: 2
; PASSIVE-NEXT: Locals: []
; PASSIVE-NEXT: Body: 0B
@@ -74,14 +74,14 @@ target triple = "wasm32-unknown-unknown"
; PASSIVE-NEXT: Segments:
; PASSIVE-NEXT: - SectionOffset: 3
; PASSIVE-NEXT: InitFlags: 1
+; PASSIVE-NEXT: Content: 636F6E7374616E74000000002B
+; PASSIVE-NEXT: - SectionOffset: 18
+; PASSIVE-NEXT: InitFlags: 1
; PASSIVE-NEXT: Content: 68656C6C6F00676F6F646279650000002A000000
-; PASSIVE-NEXT: - SectionOffset: 26
+; PASSIVE-NEXT: - SectionOffset: 41
; PASSIVE-NEXT: InitFlags: 1
; PASSIVE-NEXT: Content: '0000000000
; PASSIVE-SAME: 0000000000'
-; PASSIVE-NEXT: - SectionOffset: 10028
-; PASSIVE-NEXT: InitFlags: 1
-; PASSIVE-NEXT: Content: 636F6E7374616E74000000002B
; PASSIVE-NEXT: - Type: CUSTOM
; PASSIVE-NEXT: Name: name
; PASSIVE-NEXT: FunctionNames:
@@ -89,5 +89,5 @@ target triple = "wasm32-unknown-unknown"
; PASSIVE-NEXT: Name: __wasm_call_ctors
; PASSIVE-NEXT: - Index: 1
; PASSIVE-NEXT: Name: __wasm_init_memory
-; PASSIVE-NEXT: - Index: 2
-; PASSIVE-NEXT: Name: __wasm_init_tls
+; PASSIVE-NEXT: - Index: 2
+; PASSIVE-NEXT: Name: __wasm_init_tls
Modified: lld/trunk/test/wasm/reloc-addend.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/reloc-addend.ll?rev=372284&r1=372283&r2=372284&view=diff
==============================================================================
--- lld/trunk/test/wasm/reloc-addend.ll (original)
+++ lld/trunk/test/wasm/reloc-addend.ll Wed Sep 18 18:14:59 2019
@@ -12,8 +12,8 @@ target triple = "wasm32-unknown-unknown"
@bar = hidden local_unnamed_addr global i32* getelementptr inbounds ([76 x i32], [76 x i32]* @foo, i32 0, i32 16), align 4
; CHECK: - Type: DATA
-; CHECK-NEXT: Relocations:
+; CHECK-NEXT: Relocations:
; CHECK-NEXT: - Type: R_WASM_MEMORY_ADDR_I32
; CHECK-NEXT: Index: 0
-; CHECK-NEXT: Offset: 0x0000013D
+; CHECK-NEXT: Offset: 0x00000006
; CHECK-NEXT: Addend: 64
Modified: lld/trunk/test/wasm/relocatable.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/relocatable.ll?rev=372284&r1=372283&r2=372284&view=diff
==============================================================================
--- lld/trunk/test/wasm/relocatable.ll (original)
+++ lld/trunk/test/wasm/relocatable.ll Wed Sep 18 18:14:59 2019
@@ -113,21 +113,21 @@ entry:
; CHECK-NEXT: Body: 1081808080001A1082808080001A41010B
; CHECK-NEXT: - Index: 5
; CHECK-NEXT: Locals:
-; CHECK-NEXT: Body: 419C808080000B
+; CHECK-NEXT: Body: 4187808080000B
; NORMAL-NEXT: - Type: DATA
; NORMAL-NEXT: Relocations:
; NORMAL-NEXT: - Type: R_WASM_TABLE_INDEX_I32
; NORMAL-NEXT: Index: 3
-; NORMAL-NEXT: Offset: 0x00000012
+; NORMAL-NEXT: Offset: 0x0000001A
; NORMAL-NEXT: - Type: R_WASM_TABLE_INDEX_I32
; NORMAL-NEXT: Index: 4
-; NORMAL-NEXT: Offset: 0x0000001B
+; NORMAL-NEXT: Offset: 0x00000023
; NORMAL-NEXT: - Type: R_WASM_TABLE_INDEX_I32
; NORMAL-NEXT: Index: 5
-; NORMAL-NEXT: Offset: 0x00000024
+; NORMAL-NEXT: Offset: 0x0000002C
; NORMAL-NEXT: - Type: R_WASM_MEMORY_ADDR_I32
; NORMAL-NEXT: Index: 12
-; NORMAL-NEXT: Offset: 0x0000002D
+; NORMAL-NEXT: Offset: 0x00000035
; NORMAL-NEXT: Segments:
; NORMAL-NEXT: - SectionOffset: 6
; NORMAL-NEXT: InitFlags: 0
@@ -139,32 +139,32 @@ entry:
; NORMAL-NEXT: InitFlags: 0
; NORMAL-NEXT: Offset:
; NORMAL-NEXT: Opcode: I32_CONST
-; NORMAL-NEXT: Value: 8
-; NORMAL-NEXT: Content: '01000000'
-; NORMAL-NEXT: - SectionOffset: 27
+; NORMAL-NEXT: Value: 7
+; NORMAL-NEXT: Content: '616263'
+; NORMAL-NEXT: - SectionOffset: 26
; NORMAL-NEXT: InitFlags: 0
; NORMAL-NEXT: Offset:
; NORMAL-NEXT: Opcode: I32_CONST
; NORMAL-NEXT: Value: 12
-; NORMAL-NEXT: Content: '02000000'
-; NORMAL-NEXT: - SectionOffset: 36
+; NORMAL-NEXT: Content: '01000000'
+; NORMAL-NEXT: - SectionOffset: 35
; NORMAL-NEXT: InitFlags: 0
; NORMAL-NEXT: Offset:
; NORMAL-NEXT: Opcode: I32_CONST
; NORMAL-NEXT: Value: 16
-; NORMAL-NEXT: Content: '03000000'
-; NORMAL-NEXT: - SectionOffset: 45
+; NORMAL-NEXT: Content: '02000000'
+; NORMAL-NEXT: - SectionOffset: 44
; NORMAL-NEXT: InitFlags: 0
; NORMAL-NEXT: Offset:
; NORMAL-NEXT: Opcode: I32_CONST
-; NORMAL-NEXT: Value: 24
-; NORMAL-NEXT: Content: '00000000'
-; NORMAL-NEXT: - SectionOffset: 54
+; NORMAL-NEXT: Value: 20
+; NORMAL-NEXT: Content: '03000000'
+; NORMAL-NEXT: - SectionOffset: 53
; NORMAL-NEXT: InitFlags: 0
; NORMAL-NEXT: Offset:
; NORMAL-NEXT: Opcode: I32_CONST
-; NORMAL-NEXT: Value: 28
-; NORMAL-NEXT: Content: '616263'
+; NORMAL-NEXT: Value: 24
+; NORMAL-NEXT: Content: '00000000'
; NORMAL-NEXT: - Type: CUSTOM
; NORMAL-NEXT: Name: linking
; NORMAL-NEXT: Version: 2
@@ -209,31 +209,31 @@ entry:
; NORMAL-NEXT: Kind: DATA
; NORMAL-NEXT: Name: data_comdat
; NORMAL-NEXT: Flags: [ BINDING_WEAK ]
-; NORMAL-NEXT: Segment: 5
+; NORMAL-NEXT: Segment: 1
; NORMAL-NEXT: Size: 3
; NORMAL-NEXT: - Index: 8
; NORMAL-NEXT: Kind: DATA
; NORMAL-NEXT: Name: func_addr1
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
-; NORMAL-NEXT: Segment: 1
+; NORMAL-NEXT: Segment: 2
; NORMAL-NEXT: Size: 4
; NORMAL-NEXT: - Index: 9
; NORMAL-NEXT: Kind: DATA
; NORMAL-NEXT: Name: func_addr2
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
-; NORMAL-NEXT: Segment: 2
+; NORMAL-NEXT: Segment: 3
; NORMAL-NEXT: Size: 4
; NORMAL-NEXT: - Index: 10
; NORMAL-NEXT: Kind: DATA
; NORMAL-NEXT: Name: func_addr3
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
-; NORMAL-NEXT: Segment: 3
+; NORMAL-NEXT: Segment: 4
; NORMAL-NEXT: Size: 4
; NORMAL-NEXT: - Index: 11
; NORMAL-NEXT: Kind: DATA
; NORMAL-NEXT: Name: data_addr1
; NORMAL-NEXT: Flags: [ VISIBILITY_HIDDEN ]
-; NORMAL-NEXT: Segment: 4
+; NORMAL-NEXT: Segment: 5
; NORMAL-NEXT: Size: 4
; NORMAL-NEXT: - Index: 12
; NORMAL-NEXT: Kind: DATA
@@ -245,32 +245,32 @@ entry:
; NORMAL-NEXT: Alignment: 0
; NORMAL-NEXT: Flags: [ ]
; NORMAL-NEXT: - Index: 1
+; NORMAL-NEXT: Name: .rodata.data_comdat
+; NORMAL-NEXT: Alignment: 0
+; NORMAL-NEXT: Flags: [ ]
+; NORMAL-NEXT: - Index: 2
; NORMAL-NEXT: Name: .data.func_addr1
; NORMAL-NEXT: Alignment: 2
; NORMAL-NEXT: Flags: [ ]
-; NORMAL-NEXT: - Index: 2
+; NORMAL-NEXT: - Index: 3
; NORMAL-NEXT: Name: .data.func_addr2
; NORMAL-NEXT: Alignment: 2
; NORMAL-NEXT: Flags: [ ]
-; NORMAL-NEXT: - Index: 3
+; NORMAL-NEXT: - Index: 4
; NORMAL-NEXT: Name: .data.func_addr3
; NORMAL-NEXT: Alignment: 2
; NORMAL-NEXT: Flags: [ ]
-; NORMAL-NEXT: - Index: 4
+; NORMAL-NEXT: - Index: 5
; NORMAL-NEXT: Name: .data.data_addr1
; NORMAL-NEXT: Alignment: 3
; NORMAL-NEXT: Flags: [ ]
-; NORMAL-NEXT: - Index: 5
-; NORMAL-NEXT: Name: .rodata.data_comdat
-; NORMAL-NEXT: Alignment: 0
-; NORMAL-NEXT: Flags: [ ]
; NORMAL-NEXT: Comdats:
; NORMAL-NEXT: - Name: func_comdat
; NORMAL-NEXT: Entries:
; NORMAL-NEXT: - Kind: FUNCTION
; NORMAL-NEXT: Index: 5
; NORMAL-NEXT: - Kind: DATA
-; NORMAL-NEXT: Index: 5
+; NORMAL-NEXT: Index: 1
; NORMAL-NEXT: - Type: CUSTOM
; NORMAL-NEXT: Name: name
; NORMAL-NEXT: FunctionNames:
Modified: lld/trunk/test/wasm/tls-align.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/tls-align.ll?rev=372284&r1=372283&r2=372284&view=diff
==============================================================================
--- lld/trunk/test/wasm/tls-align.ll (original)
+++ lld/trunk/test/wasm/tls-align.ll Wed Sep 18 18:14:59 2019
@@ -24,7 +24,7 @@ define i32* @tls2_addr() {
; CHECK-NEXT: Mutable: true
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 66608
+; CHECK-NEXT: Value: 66592
; __tls_base
; CHECK-NEXT: - Index: 1
Modified: lld/trunk/test/wasm/tls.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/tls.ll?rev=372284&r1=372283&r2=372284&view=diff
==============================================================================
--- lld/trunk/test/wasm/tls.ll (original)
+++ lld/trunk/test/wasm/tls.ll Wed Sep 18 18:14:59 2019
@@ -66,7 +66,7 @@ declare i32 @llvm.wasm.tls.align.i32()
; Skip __wasm_call_ctors and __wasm_init_memory
; CHECK: - Index: 2
; CHECK-NEXT: Locals: []
-; CHECK-NEXT: Body: 20002401200041004108FC0801000B
+; CHECK-NEXT: Body: 20002401200041004108FC0800000B
; Expected body of __wasm_init_tls:
; local.get 0
Modified: lld/trunk/wasm/OutputSegment.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/OutputSegment.h?rev=372284&r1=372283&r2=372284&view=diff
==============================================================================
--- lld/trunk/wasm/OutputSegment.h (original)
+++ lld/trunk/wasm/OutputSegment.h Wed Sep 18 18:14:59 2019
@@ -20,7 +20,7 @@ class InputSegment;
class OutputSegment {
public:
- OutputSegment(StringRef n, uint32_t index) : name(n), index(index) {}
+ OutputSegment(StringRef n) : name(n) {}
void addInputSegment(InputSegment *inSeg) {
alignment = std::max(alignment, inSeg->getAlignment());
@@ -32,7 +32,7 @@ public:
}
StringRef name;
- const uint32_t index;
+ uint32_t index = 0;
uint32_t initFlags = 0;
uint32_t sectionOffset = 0;
uint32_t alignment = 0;
Modified: lld/trunk/wasm/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Writer.cpp?rev=372284&r1=372283&r2=372284&view=diff
==============================================================================
--- lld/trunk/wasm/Writer.cpp (original)
+++ lld/trunk/wasm/Writer.cpp Wed Sep 18 18:14:59 2019
@@ -263,7 +263,6 @@ void Writer::layoutMemory() {
memoryPtr += 4;
}
- // TODO: Add .bss space here.
if (WasmSym::dataEnd)
WasmSym::dataEnd->setVirtualAddress(memoryPtr);
@@ -667,7 +666,7 @@ void Writer::createOutputSegments() {
OutputSegment *&s = segmentMap[name];
if (s == nullptr) {
LLVM_DEBUG(dbgs() << "new segment: " << name << "\n");
- s = make<OutputSegment>(name, segments.size());
+ s = make<OutputSegment>(name);
if (config->sharedMemory || name == ".tdata")
s->initFlags = WASM_SEGMENT_IS_PASSIVE;
segments.push_back(s);
@@ -676,6 +675,24 @@ void Writer::createOutputSegments() {
LLVM_DEBUG(dbgs() << "added data: " << name << ": " << s->size << "\n");
}
}
+
+ // Sort segments by type, placing .bss last
+ std::stable_sort(segments.begin(), segments.end(),
+ [](const OutputSegment *a, const OutputSegment *b) {
+ auto order = [](StringRef name) {
+ return StringSwitch<int>(name)
+ .StartsWith(".rodata", 0)
+ .StartsWith(".data", 1)
+ .StartsWith(".tdata", 2)
+ .StartsWith(".bss", 4)
+ .Default(3);
+ };
+ return order(a->name) < order(b->name);
+ });
+
+ for (size_t i = 0; i < segments.size(); ++i) {
+ segments[i]->index = i;
+ }
}
static void createFunction(DefinedFunction *func, StringRef bodyContent) {
More information about the llvm-commits
mailing list