[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