[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