[llvm] [yaml2obj][COFF] Add BBAddrMap support to yaml2coff (PR #224504)
James Henderson via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 23 01:27:19 PDT 2026
================
@@ -0,0 +1,321 @@
+## Check how yaml2obj produces .llvm_bb_addr_map sections.
+
+# RUN: yaml2obj --docnum=1 %s -o %t1 2>&1 | FileCheck %s --check-prefix=WARN
+# RUN: llvm-readobj --sections --section-data %t1 | FileCheck %s
+
+# WARN: warning: feature value(0) does not support multiple BB ranges.
+
+## Case 1: Specify SectionData.
+# CHECK: Number: 1
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0xD
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 00000000 00000000 01010203 04
+# CHECK-NEXT: )
+
+## Case 2: Empty.
+# CHECK: Number: 2
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0x0
+# CHECK-NEXT: PointerToRawData: 0x0
+
+## Case 3: Specify SizeOfRawData only.
+# CHECK: Number: 3
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0x8
+# CHECK-NEXT: PointerToRawData: 0x0
+
+## Case 4: Specify Entries.
+# CHECK: Number: 4
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0x12
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 03002000 00000000 0000010B 01020102
+# CHECK-NEXT: 0010: 0203
+# CHECK-NEXT: )
+
+## Case 5: Omitting BaseAddress zeroes bytes 2-9 of SectionData below.
+# CHECK: Number: 5
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0xF
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 03000000 00000000 0000010C 010203
+# CHECK-NEXT: )
+
+## Case 6: Override the NumBlocks field.
+# CHECK: Number: 6
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0xF
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 03002000 00000000 0000020D 010203
+# CHECK-NEXT: )
+
+## Case 7: Specify empty BBRanges.
+# CHECK: Number: 7
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0x3
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 030000
+# CHECK-NEXT: )
+
+## Case 8: Specify empty BBRanges with multi-bb-range.
+# CHECK: Number: 8
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0x3
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 030800
+# CHECK-NEXT: )
+
+## Case 9: Specify empty CallsiteEndOffsets.
+# CHECK: Number: 9
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0x10
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 03202000 00000000 0000010E 01000203
+# CHECK-NEXT: )
+
+## Case 10: Specify basic block hash.
+# CHECK: Number: 10
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0x18
+# CHECK: SectionData (
+# CHECK-NEXT: 0000: 04602000 00000000 0000010E 01000203
+# CHECK-NEXT: 0010: 23010000 00000000
+# CHECK-NEXT: )
+
+## Case 11: Specify empty Entries. The section stays empty, like Case 2.
+# CHECK: Number: 11
+# CHECK-NEXT: Name: .llvm_bb_addr_map
+# CHECK: RawDataSize: 0x0
+# CHECK-NEXT: PointerToRawData: 0x0
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+sections:
+
+## Test the following cases:
+
+## 1) We can produce a .llvm_bb_addr_map section from a description with section
+## content.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ SectionData: "00000000000000000101020304"
+
+## 2) We can produce an empty .llvm_bb_addr_map section from a description with
+## no content keys at all.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+
+## 3) We can produce a .llvm_bb_addr_map section of a specific size when we
+## specify the size only.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ SizeOfRawData: 8
+
+## 4) We can produce a .llvm_bb_addr_map section from a description with Entries.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Entries:
+ - Version: 3
+ BBRanges:
+ - BaseAddress: 0x0000000000000020
+ BBEntries:
+ - ID: 11
+ AddressOffset: 0x00000001
+ Size: 0x00000002
+ Metadata: 0x00000003
+ CallsiteEndOffsets: [0x1, 0x2]
+
+## 5) When specifying the description with Entries, the 'BaseAddress' field will
+## be zero when omitted.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Entries:
+ - Version: 3
+ BBRanges:
+ - BBEntries:
+ - ID: 12
+ AddressOffset: 0x00000001
+ Size: 0x00000002
+ Metadata: 0x00000003
+
+## 6) We can override the NumBlocks field with a value different from the actual
+## number of BB Entries.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Entries:
+ - Version: 3
+ BBRanges:
+ - BaseAddress: 0x0000000000000020
+ NumBlocks: 2
+ BBEntries:
+ - ID: 13
+ AddressOffset: 0x00000001
+ Size: 0x00000002
+ Metadata: 0x00000003
+
+## 7) We can produce a .llvm_bb_addr_map section from a description with one
+## entry with empty BBRanges.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Entries:
+ - Version: 3
+ BBRanges: []
+
+## 8) We can produce a .llvm_bb_addr_map section from a multi-bb-range
+## description with one entry with empty BBRanges.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Entries:
+ - Version: 3
+ Feature: 0x8
+ BBRanges: []
+
+## 9) We can produce a .llvm_bb_addr_map section from a description with empty
+## callsite offsets.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Entries:
+ - Version: 3
+ Feature: 0x20
+ BBRanges:
+ - BaseAddress: 0x0000000000000020
+ BBEntries:
+ - ID: 14
+ AddressOffset: 0x00000001
+ Size: 0x00000002
+ Metadata: 0x00000003
+ CallsiteEndOffsets: []
+
+## 10) We can produce a .llvm_bb_addr_map section with basic block hash.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Entries:
+ - Version: 4
+ Feature: 0x60
+ BBRanges:
+ - BaseAddress: 0x0000000000000020
+ BBEntries:
+ - ID: 14
+ AddressOffset: 0x00000001
+ Size: 0x00000002
+ Metadata: 0x00000003
+ CallsiteEndOffsets: []
+ Hash: 0x123
+
+## 11) An empty Entries list encodes nothing, so the section has no content.
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Entries: []
+symbols: []
+...
+
+## Check that a 32-bit machine encodes the range base address in four bytes.
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readobj --sections --section-data %t2 | FileCheck %s --check-prefix=I386
+
+# I386: Name: .llvm_bb_addr_map
+# I386: RawDataSize: 0xB
+# I386: SectionData (
+# I386-NEXT: 0000: 03002000 0000010B 010203
+# I386-NEXT: )
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_I386
+sections:
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Entries:
+ - Version: 3
+ BBRanges:
+ - BaseAddress: 0x0000000000000020
+ BBEntries:
+ - ID: 11
+ AddressOffset: 0x00000001
+ Size: 0x00000002
+ Metadata: 0x00000003
+symbols: []
+...
+
+## Check that "Entries" describes the whole section content, so it can't be
+## combined with SectionData, StructuredData or SizeOfRawData.
+# RUN: not yaml2obj --docnum=3 %s -o %t 2>&1 | FileCheck %s --check-prefix=CONFLICT
+# RUN: not yaml2obj --docnum=4 %s -o %t 2>&1 | FileCheck %s --check-prefix=CONFLICT
+# RUN: not yaml2obj --docnum=5 %s -o %t 2>&1 | FileCheck %s --check-prefix=CONFLICT
+
+# CONFLICT: error: Entries can't be used with SectionData, StructuredData or SizeOfRawData
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+sections:
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ]
+ Entries: []
+ SectionData: "00"
+symbols: []
+...
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+sections:
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ]
+ Entries: []
+ StructuredData:
+ - UInt32: 1
+symbols: []
+...
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+sections:
+ - Name: .llvm_bb_addr_map
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ]
+ Entries: []
+ SizeOfRawData: 4
+symbols: []
+...
+
+## Check that "Entries" is only recognized on a .llvm_bb_addr_map section.
----------------
jh7370 wrote:
Hmm, not sure about this case being in the bb-addr-map.yaml test, because it's not unreasonable that at some point we'd add `Entries` to another section type. I would be okay with it being a in a separate test file, probably one that is testing generic section behaviour.
https://github.com/llvm/llvm-project/pull/224504
More information about the llvm-commits
mailing list