[llvm] Add XCOFF object file support in sanitizer coverage tool (PR #179884)

Honey Goyal via llvm-commits llvm-commits at lists.llvm.org
Sun Mar 15 06:07:57 PDT 2026


https://github.com/honeygoyal updated https://github.com/llvm/llvm-project/pull/179884

>From 3ea27ec53b587b22862ab766f190c8a146cea0d6 Mon Sep 17 00:00:00 2001
From: Honey Goyal <honey.goyal3 at ibm.com>
Date: Thu, 5 Feb 2026 08:33:27 +0000
Subject: [PATCH 1/7] Add XCOFF object file support in sanitizer coverage tool

---
 llvm/tools/sancov/sancov.cpp | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/llvm/tools/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp
index 504ea622d1e69..401632b24b4b6 100644
--- a/llvm/tools/sancov/sancov.cpp
+++ b/llvm/tools/sancov/sancov.cpp
@@ -29,6 +29,7 @@
 #include "llvm/Object/COFF.h"
 #include "llvm/Object/MachO.h"
 #include "llvm/Object/ObjectFile.h"
+#include "llvm/Object/XCOFFObjectFile.h"
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/Casting.h"
@@ -718,7 +719,22 @@ findSanitizerCovFunctions(const object::ObjectFile &O) {
   if (const auto *MO = dyn_cast<object::MachOObjectFile>(&O)) {
     findMachOIndirectCovFunctions(*MO, &Result);
   }
-
+  if (const auto *XO = dyn_cast<object::XCOFFObjectFile>(&O)) {
+    for (const object::SymbolRef &Symbol : XO->symbols()) {
+      Expected<uint64_t> AddressOrErr = Symbol.getAddress();
+      failIfError(AddressOrErr);
+      uint64_t Address = AddressOrErr.get();
+
+      Expected<StringRef> NameOrErr = Symbol.getName();
+      failIfError(NameOrErr);
+      StringRef Name = NameOrErr.get();
+
+      if (isCoveragePointSymbol(Name) || 
+         (Name.starts_with(".") && isCoveragePointSymbol(Name.drop_front(1)))) {
+        Result.insert(Address);
+      }
+    }
+  }
   return Result;
 }
 

>From 7805dd150ecc1f3cd579dd6877e3d6f9d84214e2 Mon Sep 17 00:00:00 2001
From: Honey Goyal <honey.goyal3 at ibm.com>
Date: Tue, 10 Feb 2026 08:52:33 +0000
Subject: [PATCH 2/7] "Clang format file"

---
 llvm/tools/sancov/sancov.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/llvm/tools/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp
index 401632b24b4b6..a46d8b302fc45 100644
--- a/llvm/tools/sancov/sancov.cpp
+++ b/llvm/tools/sancov/sancov.cpp
@@ -729,8 +729,9 @@ findSanitizerCovFunctions(const object::ObjectFile &O) {
       failIfError(NameOrErr);
       StringRef Name = NameOrErr.get();
 
-      if (isCoveragePointSymbol(Name) || 
-         (Name.starts_with(".") && isCoveragePointSymbol(Name.drop_front(1)))) {
+      if (isCoveragePointSymbol(Name) ||
+          (Name.starts_with(".") &&
+           isCoveragePointSymbol(Name.drop_front(1)))) {
         Result.insert(Address);
       }
     }

>From 552a8d2f86ca68843d2200276b6db103c74bbb74 Mon Sep 17 00:00:00 2001
From: Honey Goyal <honey.goyal3 at ibm.com>
Date: Tue, 17 Feb 2026 10:09:00 +0000
Subject: [PATCH 3/7] Update XCOFF support in existing loop

---
 llvm/tools/sancov/sancov.cpp | 26 ++++++++------------------
 1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/llvm/tools/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp
index a46d8b302fc45..0238e2de2d2a1 100644
--- a/llvm/tools/sancov/sancov.cpp
+++ b/llvm/tools/sancov/sancov.cpp
@@ -696,8 +696,14 @@ findSanitizerCovFunctions(const object::ObjectFile &O) {
     failIfError(FlagsOrErr);
     uint32_t Flags = FlagsOrErr.get();
 
+    StringRef EffectiveName = Name;
+    
+    if (isa<object::XCOFFObjectFile>(&O) && Name.starts_with(".")) { 
+      EffectiveName = Name.drop_front(1);
+    }
+
     if (!(Flags & object::BasicSymbolRef::SF_Undefined) &&
-        isCoveragePointSymbol(Name)) {
+        isCoveragePointSymbol(EffectiveName)) {
       Result.insert(Address);
     }
   }
@@ -719,23 +725,7 @@ findSanitizerCovFunctions(const object::ObjectFile &O) {
   if (const auto *MO = dyn_cast<object::MachOObjectFile>(&O)) {
     findMachOIndirectCovFunctions(*MO, &Result);
   }
-  if (const auto *XO = dyn_cast<object::XCOFFObjectFile>(&O)) {
-    for (const object::SymbolRef &Symbol : XO->symbols()) {
-      Expected<uint64_t> AddressOrErr = Symbol.getAddress();
-      failIfError(AddressOrErr);
-      uint64_t Address = AddressOrErr.get();
-
-      Expected<StringRef> NameOrErr = Symbol.getName();
-      failIfError(NameOrErr);
-      StringRef Name = NameOrErr.get();
-
-      if (isCoveragePointSymbol(Name) ||
-          (Name.starts_with(".") &&
-           isCoveragePointSymbol(Name.drop_front(1)))) {
-        Result.insert(Address);
-      }
-    }
-  }
+   
   return Result;
 }
 

>From 0ea35ad6f3dcd530a5cbd10d72bf8f8ac497c875 Mon Sep 17 00:00:00 2001
From: Honey Goyal <honey.goyal3 at ibm.com>
Date: Wed, 18 Feb 2026 21:43:20 +0000
Subject: [PATCH 4/7] Add XCOFF symbol prefix test and comments

---
 llvm/test/tools/sancov/XCOFF/lit.local.cfg    |  1 +
 .../sancov/XCOFF/xcoff-sancov-symbols.test    | 26 +++++++++++++++++++
 llvm/tools/sancov/sancov.cpp                  | 13 +++++-----
 3 files changed, 33 insertions(+), 7 deletions(-)
 create mode 100644 llvm/test/tools/sancov/XCOFF/lit.local.cfg
 create mode 100644 llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test

diff --git a/llvm/test/tools/sancov/XCOFF/lit.local.cfg b/llvm/test/tools/sancov/XCOFF/lit.local.cfg
new file mode 100644
index 0000000000000..3d33f4d55784e
--- /dev/null
+++ b/llvm/test/tools/sancov/XCOFF/lit.local.cfg
@@ -0,0 +1 @@
+config.requires = ['powerpc-registered-target']
diff --git a/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test b/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test
new file mode 100644
index 0000000000000..ee08e8ceaca4f
--- /dev/null
+++ b/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test
@@ -0,0 +1,26 @@
+## In XCOFF (AIX), function entry point symbols have a "." prefix.
+## This test verifies sancov correctly strips the prefix.
+
+# REQUIRES: powerpc-registered-target
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: sancov -print-coverage-pcs %t.o
+
+--- !XCOFF
+FileHeader:
+  MagicNumber: 0x01F7
+Sections:
+  - Name: .text
+    Flags: [ STYP_TEXT ]
+    SectionData: "60000000"
+Symbols:
+  - Name: .__sanitizer_cov_trace_pc_guard
+    Value: 0x1000
+    Section: .text
+    Type: 0x0
+    StorageClass: C_EXT
+    NumberOfAuxEntries: 1
+    AuxEntries:
+      - Type: AUX_CSECT
+        SymbolType: XTY_LD
+        StorageMappingClass: XMC_PR
\ No newline at end of file
diff --git a/llvm/tools/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp
index 0238e2de2d2a1..931f87731681a 100644
--- a/llvm/tools/sancov/sancov.cpp
+++ b/llvm/tools/sancov/sancov.cpp
@@ -696,12 +696,11 @@ findSanitizerCovFunctions(const object::ObjectFile &O) {
     failIfError(FlagsOrErr);
     uint32_t Flags = FlagsOrErr.get();
 
-    StringRef EffectiveName = Name;
-    
-    if (isa<object::XCOFFObjectFile>(&O) && Name.starts_with(".")) { 
-      EffectiveName = Name.drop_front(1);
-    }
-
+    // XCOFF uses "." prefix for function entry point symbols.
+    StringRef EffectiveName =
+        (isa<object::XCOFFObjectFile>(&O) && Name.starts_with("."))
+            ? Name.drop_front(1)
+            : Name;
     if (!(Flags & object::BasicSymbolRef::SF_Undefined) &&
         isCoveragePointSymbol(EffectiveName)) {
       Result.insert(Address);
@@ -725,7 +724,7 @@ findSanitizerCovFunctions(const object::ObjectFile &O) {
   if (const auto *MO = dyn_cast<object::MachOObjectFile>(&O)) {
     findMachOIndirectCovFunctions(*MO, &Result);
   }
-   
+
   return Result;
 }
 

>From 0ee6bfc2bc00466670c88d03978def342363bd67 Mon Sep 17 00:00:00 2001
From: Honey Goyal <honey.goyal3 at ibm.com>
Date: Thu, 12 Mar 2026 20:54:27 +0000
Subject: [PATCH 5/7] Change config file to match the parent repo

---
 llvm/test/tools/sancov/XCOFF/lit.local.cfg | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/test/tools/sancov/XCOFF/lit.local.cfg b/llvm/test/tools/sancov/XCOFF/lit.local.cfg
index 3d33f4d55784e..bb982488eb15e 100644
--- a/llvm/test/tools/sancov/XCOFF/lit.local.cfg
+++ b/llvm/test/tools/sancov/XCOFF/lit.local.cfg
@@ -1 +1,2 @@
-config.requires = ['powerpc-registered-target']
+if not "PowerPC" in config.root.targets:
+    config.unsupported = True

>From 588c5e43dc4590c5c7ccf9e79cd366cf4510566f Mon Sep 17 00:00:00 2001
From: Honey Goyal <honey.goyal3 at ibm.com>
Date: Sun, 15 Mar 2026 12:26:20 +0000
Subject: [PATCH 6/7] Add sancov XCOFF test for dot-prefixed symbols

---
 .../sancov/XCOFF/xcoff-sancov-symbols.test    | 41 +++++++++++--------
 1 file changed, 25 insertions(+), 16 deletions(-)

diff --git a/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test b/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test
index ee08e8ceaca4f..22131bce0e919 100644
--- a/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test
+++ b/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test
@@ -1,26 +1,35 @@
-## In XCOFF (AIX), function entry point symbols have a "." prefix.
-## This test verifies sancov correctly strips the prefix.
-
 # REQUIRES: powerpc-registered-target
-
 # RUN: yaml2obj %s -o %t.o
-# RUN: sancov -print-coverage-pcs %t.o
+# RUN: sancov -print-coverage-pcs %t.o | FileCheck %s
+
+# CHECK: 0x0
 
 --- !XCOFF
 FileHeader:
   MagicNumber: 0x01F7
 Sections:
-  - Name: .text
-    Flags: [ STYP_TEXT ]
-    SectionData: "60000000"
+  - Name:            .text
+    Flags:           [ STYP_TEXT ]
+    SectionData:     "60000000"
 Symbols:
-  - Name: .__sanitizer_cov_trace_pc_guard
-    Value: 0x1000
-    Section: .text
-    Type: 0x0
-    StorageClass: C_EXT
+  - Name:            ''
+    Value:           0x0
+    Section:         .text
+    StorageClass:    C_HIDEXT
+    NumberOfAuxEntries: 1
+    AuxEntries:
+      - Type:                   AUX_CSECT
+        SectionOrLength:        4
+        SymbolAlignmentLog2:    5
+        SymbolType:             XTY_SD
+        StorageMappingClass:    XMC_PR
+  - Name:            .__sanitizer_cov_trace_pc_guard
+    Value:           0x0
+    Section:         .text
+    StorageClass:    C_EXT
     NumberOfAuxEntries: 1
     AuxEntries:
-      - Type: AUX_CSECT
-        SymbolType: XTY_LD
-        StorageMappingClass: XMC_PR
\ No newline at end of file
+      - Type:                   AUX_CSECT
+        ContainingCsectSymbolIndex: 0
+        SymbolType:             XTY_LD
+        StorageMappingClass:    XMC_PR

>From e418faf9db02360dd9509d8b5a7186a0017bad97 Mon Sep 17 00:00:00 2001
From: Honey Goyal <honey.goyal3 at ibm.com>
Date: Sun, 15 Mar 2026 13:19:57 +0000
Subject: [PATCH 7/7] Update test

---
 .../sancov/XCOFF/xcoff-sancov-symbols.test    | 37 +++++--------------
 1 file changed, 10 insertions(+), 27 deletions(-)

diff --git a/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test b/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test
index 22131bce0e919..77a7fa15dcd67 100644
--- a/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test
+++ b/llvm/test/tools/sancov/XCOFF/xcoff-sancov-symbols.test
@@ -1,35 +1,18 @@
 # REQUIRES: powerpc-registered-target
-# RUN: yaml2obj %s -o %t.o
-# RUN: sancov -print-coverage-pcs %t.o | FileCheck %s
 
-# CHECK: 0x0
+# RUN: yaml2obj %s -o %t.o
+# RUN: sancov -print-coverage-pcs %t.o
 
 --- !XCOFF
 FileHeader:
   MagicNumber: 0x01F7
 Sections:
-  - Name:            .text
-    Flags:           [ STYP_TEXT ]
-    SectionData:     "60000000"
+  - Name: .text
+    Flags: [ STYP_TEXT ]
+    SectionData: "60000000"
 Symbols:
-  - Name:            ''
-    Value:           0x0
-    Section:         .text
-    StorageClass:    C_HIDEXT
-    NumberOfAuxEntries: 1
-    AuxEntries:
-      - Type:                   AUX_CSECT
-        SectionOrLength:        4
-        SymbolAlignmentLog2:    5
-        SymbolType:             XTY_SD
-        StorageMappingClass:    XMC_PR
-  - Name:            .__sanitizer_cov_trace_pc_guard
-    Value:           0x0
-    Section:         .text
-    StorageClass:    C_EXT
-    NumberOfAuxEntries: 1
-    AuxEntries:
-      - Type:                   AUX_CSECT
-        ContainingCsectSymbolIndex: 0
-        SymbolType:             XTY_LD
-        StorageMappingClass:    XMC_PR
+  - Name: .__sanitizer_cov_trace_pc_guard
+    Value: 0x1000
+    Section: .text
+    Type: 0x0
+    StorageClass: C_EXT



More information about the llvm-commits mailing list