[lld] wasm-ld: Implement function pointer alignment (PR #105532)
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Mon May 12 09:37:54 PDT 2025
================
@@ -31,207 +34,28 @@ func2:
.functype func2 () -> ()
end_function
+.globl func3
+func3:
+ .functype func3 () -> ()
+ end_function
-# CHECK-DEFAULT: --- !WASM
-# CHECK-DEFAULT-NEXT: FileHeader:
-# CHECK-DEFAULT-NEXT: Version: 0x1
-# CHECK-DEFAULT-NEXT: Sections:
-# CHECK-DEFAULT-NEXT: - Type: TYPE
-# CHECK-DEFAULT-NEXT: Signatures:
-# CHECK-DEFAULT-NEXT: - Index: 0
-# CHECK-DEFAULT-NEXT: ParamTypes: []
-# CHECK-DEFAULT-NEXT: ReturnTypes: []
-# CHECK-DEFAULT-NEXT: - Type: FUNCTION
-# CHECK-DEFAULT-NEXT: FunctionTypes: [ 0, 0, 0 ]
-# CHECK-DEFAULT-NEXT: - Type: TABLE
-# CHECK-DEFAULT-NEXT: Tables:
-# CHECK-DEFAULT-NEXT: - Index: 0
-# CHECK-DEFAULT-NEXT: ElemType: FUNCREF
-# CHECK-DEFAULT-NEXT: Limits:
-# CHECK-DEFAULT-NEXT: Flags: [ HAS_MAX ]
-# CHECK-DEFAULT-NEXT: Minimum: 0x3
-# CHECK-DEFAULT-NEXT: Maximum: 0x3
-# CHECK-DEFAULT-NEXT: - Type: MEMORY
-# CHECK-DEFAULT-NEXT: Memories:
-# CHECK-DEFAULT-NEXT: - Minimum: 0x2
-# CHECK-DEFAULT-NEXT: - Type: GLOBAL
-# CHECK-DEFAULT-NEXT: Globals:
-# CHECK-DEFAULT-NEXT: - Index: 0
-# CHECK-DEFAULT-NEXT: Type: I32
-# CHECK-DEFAULT-NEXT: Mutable: true
-# CHECK-DEFAULT-NEXT: InitExpr:
-# CHECK-DEFAULT-NEXT: Opcode: I32_CONST
-# CHECK-DEFAULT-NEXT: Value: 66560
-# CHECK-DEFAULT-NEXT: - Type: EXPORT
-# CHECK-DEFAULT-NEXT: Exports:
-# CHECK-DEFAULT-NEXT: - Name: memory
-# CHECK-DEFAULT-NEXT: Kind: MEMORY
-# CHECK-DEFAULT-NEXT: Index: 0
-# CHECK-DEFAULT-NEXT: - Name: _start
-# CHECK-DEFAULT-NEXT: Kind: FUNCTION
-# CHECK-DEFAULT-NEXT: Index: 0
-# CHECK-DEFAULT-NEXT: - Type: ELEM
+# CHECK-DEFAULT: - Type: ELEM
# CHECK-DEFAULT-NEXT: Segments:
# CHECK-DEFAULT-NEXT: - Offset:
# CHECK-DEFAULT-NEXT: Opcode: I32_CONST
# CHECK-DEFAULT-NEXT: Value: 1
-# CHECK-DEFAULT-NEXT: Functions: [ 1, 2 ]
-# CHECK-DEFAULT-NEXT: - Type: CODE
-# CHECK-DEFAULT-NEXT: Functions:
-# CHECK-DEFAULT-NEXT: - Index: 0
-# CHECK-DEFAULT-NEXT: Locals: []
-# CHECK-DEFAULT-NEXT: Body: 4181808080001A4182808080001A0B
-# CHECK-DEFAULT-NEXT: - Index: 1
-# CHECK-DEFAULT-NEXT: Locals: []
-# CHECK-DEFAULT-NEXT: Body: 0B
-# CHECK-DEFAULT-NEXT: - Index: 2
-# CHECK-DEFAULT-NEXT: Locals: []
-# CHECK-DEFAULT-NEXT: Body: 0B
-# CHECK-DEFAULT-NEXT: - Type: CUSTOM
-# CHECK-DEFAULT-NEXT: Name: name
-# CHECK-DEFAULT-NEXT: FunctionNames:
-# CHECK-DEFAULT-NEXT: - Index: 0
-# CHECK-DEFAULT-NEXT: Name: _start
-# CHECK-DEFAULT-NEXT: - Index: 1
-# CHECK-DEFAULT-NEXT: Name: func1
-# CHECK-DEFAULT-NEXT: - Index: 2
-# CHECK-DEFAULT-NEXT: Name: func2
-# CHECK-DEFAULT-NEXT: GlobalNames:
-# CHECK-DEFAULT-NEXT: - Index: 0
-# CHECK-DEFAULT-NEXT: Name: __stack_pointer
+# CHECK-DEFAULT-NEXT: Functions: [ 1, 2, 3 ]
-# CHECK-2: --- !WASM
-# CHECK-2-NEXT: FileHeader:
-# CHECK-2-NEXT: Version: 0x1
-# CHECK-2-NEXT: Sections:
-# CHECK-2-NEXT: - Type: TYPE
-# CHECK-2-NEXT: Signatures:
-# CHECK-2-NEXT: - Index: 0
-# CHECK-2-NEXT: ParamTypes: []
-# CHECK-2-NEXT: ReturnTypes: []
-# CHECK-2-NEXT: - Type: FUNCTION
-# CHECK-2-NEXT: FunctionTypes: [ 0, 0, 0 ]
-# CHECK-2-NEXT: - Type: TABLE
-# CHECK-2-NEXT: Tables:
-# CHECK-2-NEXT: - Index: 0
-# CHECK-2-NEXT: ElemType: FUNCREF
-# CHECK-2-NEXT: Limits:
-# CHECK-2-NEXT: Flags: [ HAS_MAX ]
-# CHECK-2-NEXT: Minimum: 0x4
-# CHECK-2-NEXT: Maximum: 0x4
-# CHECK-2-NEXT: - Type: MEMORY
-# CHECK-2-NEXT: Memories:
-# CHECK-2-NEXT: - Minimum: 0x2
-# CHECK-2-NEXT: - Type: GLOBAL
-# CHECK-2-NEXT: Globals:
-# CHECK-2-NEXT: - Index: 0
-# CHECK-2-NEXT: Type: I32
-# CHECK-2-NEXT: Mutable: true
-# CHECK-2-NEXT: InitExpr:
-# CHECK-2-NEXT: Opcode: I32_CONST
-# CHECK-2-NEXT: Value: 66560
-# CHECK-2-NEXT: - Type: EXPORT
-# CHECK-2-NEXT: Exports:
-# CHECK-2-NEXT: - Name: memory
-# CHECK-2-NEXT: Kind: MEMORY
-# CHECK-2-NEXT: Index: 0
-# CHECK-2-NEXT: - Name: _start
-# CHECK-2-NEXT: Kind: FUNCTION
-# CHECK-2-NEXT: Index: 0
-# CHECK-2-NEXT: - Type: ELEM
+# CHECK-2: - Type: ELEM
# CHECK-2-NEXT: Segments:
# CHECK-2-NEXT: - Offset:
# CHECK-2-NEXT: Opcode: I32_CONST
# CHECK-2-NEXT: Value: 1
-# CHECK-2-NEXT: Functions: [ 1, 2, 0 ]
-# CHECK-2-NEXT: - Type: CODE
-# CHECK-2-NEXT: Functions:
-# CHECK-2-NEXT: - Index: 0
-# CHECK-2-NEXT: Locals: []
-# CHECK-2-NEXT: Body: 4181808080001A4182808080001A0B
-# CHECK-2-NEXT: - Index: 1
-# CHECK-2-NEXT: Locals: []
-# CHECK-2-NEXT: Body: 0B
-# CHECK-2-NEXT: - Index: 2
-# CHECK-2-NEXT: Locals: []
-# CHECK-2-NEXT: Body: 0B
-# CHECK-2-NEXT: - Type: CUSTOM
-# CHECK-2-NEXT: Name: name
-# CHECK-2-NEXT: FunctionNames:
-# CHECK-2-NEXT: - Index: 0
-# CHECK-2-NEXT: Name: _start
-# CHECK-2-NEXT: - Index: 1
-# CHECK-2-NEXT: Name: func1
-# CHECK-2-NEXT: - Index: 2
-# CHECK-2-NEXT: Name: func2
-# CHECK-2-NEXT: GlobalNames:
-# CHECK-2-NEXT: - Index: 0
-# CHECK-2-NEXT: Name: __stack_pointer
+# CHECK-2-NEXT: Functions: [ 1, 2, 0, 3, 0 ]
-# CHECK-3: --- !WASM
-# CHECK-3-NEXT: FileHeader:
-# CHECK-3-NEXT: Version: 0x1
-# CHECK-3-NEXT: Sections:
-# CHECK-3-NEXT: - Type: TYPE
-# CHECK-3-NEXT: Signatures:
-# CHECK-3-NEXT: - Index: 0
-# CHECK-3-NEXT: ParamTypes: []
-# CHECK-3-NEXT: ReturnTypes: []
-# CHECK-3-NEXT: - Type: FUNCTION
-# CHECK-3-NEXT: FunctionTypes: [ 0, 0, 0 ]
-# CHECK-3-NEXT: - Type: TABLE
-# CHECK-3-NEXT: Tables:
-# CHECK-3-NEXT: - Index: 0
-# CHECK-3-NEXT: ElemType: FUNCREF
-# CHECK-3-NEXT: Limits:
-# CHECK-3-NEXT: Flags: [ HAS_MAX ]
-# CHECK-3-NEXT: Minimum: 0x6
-# CHECK-3-NEXT: Maximum: 0x6
-# CHECK-3-NEXT: - Type: MEMORY
-# CHECK-3-NEXT: Memories:
-# CHECK-3-NEXT: - Minimum: 0x2
-# CHECK-3-NEXT: - Type: GLOBAL
-# CHECK-3-NEXT: Globals:
-# CHECK-3-NEXT: - Index: 0
-# CHECK-3-NEXT: Type: I32
-# CHECK-3-NEXT: Mutable: true
-# CHECK-3-NEXT: InitExpr:
-# CHECK-3-NEXT: Opcode: I32_CONST
-# CHECK-3-NEXT: Value: 66560
-# CHECK-3-NEXT: - Type: EXPORT
-# CHECK-3-NEXT: Exports:
-# CHECK-3-NEXT: - Name: memory
-# CHECK-3-NEXT: Kind: MEMORY
-# CHECK-3-NEXT: Index: 0
-# CHECK-3-NEXT: - Name: _start
-# CHECK-3-NEXT: Kind: FUNCTION
-# CHECK-3-NEXT: Index: 0
-# CHECK-3-NEXT: - Type: ELEM
+# CHECK-3: - Type: ELEM
# CHECK-3-NEXT: Segments:
# CHECK-3-NEXT: - Offset:
# CHECK-3-NEXT: Opcode: I32_CONST
# CHECK-3-NEXT: Value: 1
-# CHECK-3-NEXT: Functions: [ 1, 0, 2, 0, 0 ]
-# CHECK-3-NEXT: - Type: CODE
-# CHECK-3-NEXT: Functions:
-# CHECK-3-NEXT: - Index: 0
-# CHECK-3-NEXT: Locals: []
-# CHECK-3-NEXT: Body: 4181808080001A4183808080001A0B
-# CHECK-3-NEXT: - Index: 1
-# CHECK-3-NEXT: Locals: []
-# CHECK-3-NEXT: Body: 0B
-# CHECK-3-NEXT: - Index: 2
-# CHECK-3-NEXT: Locals: []
-# CHECK-3-NEXT: Body: 0B
-# CHECK-3-NEXT: - Type: CUSTOM
-# CHECK-3-NEXT: Name: name
-# CHECK-3-NEXT: FunctionNames:
-# CHECK-3-NEXT: - Index: 0
-# CHECK-3-NEXT: Name: _start
-# CHECK-3-NEXT: - Index: 1
-# CHECK-3-NEXT: Name: func1
-# CHECK-3-NEXT: - Index: 2
-# CHECK-3-NEXT: Name: func2
-# CHECK-3-NEXT: GlobalNames:
-# CHECK-3-NEXT: - Index: 0
-# CHECK-3-NEXT: Name: __stack_pointer
+# CHECK-3-NEXT: Functions: [ 1, 0, 2, 0, 0, 3, 0, 0 ]
----------------
sbc100 wrote:
It looks like first function is always getting address 1 here.. which seems wrong, no?
https://github.com/llvm/llvm-project/pull/105532
More information about the llvm-commits
mailing list