[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