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

Honey Goyal via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 17 01:57:52 PST 2026


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

>From 35095c95fb324244937b4edda6ce93b25b0eecae 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/3] 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 f2e71f97dda34..e7ba50a50af58 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"
@@ -713,7 +714,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 60462c6e38cf3e02dd17008d616344ba090eda1f 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/3] "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 e7ba50a50af58..3746b48cb6a89 100644
--- a/llvm/tools/sancov/sancov.cpp
+++ b/llvm/tools/sancov/sancov.cpp
@@ -724,8 +724,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 5338ccd70c68e0409218e98da9798ae045e09177 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/3] 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 3746b48cb6a89..4dcc770a45e91 100644
--- a/llvm/tools/sancov/sancov.cpp
+++ b/llvm/tools/sancov/sancov.cpp
@@ -691,8 +691,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);
     }
   }
@@ -714,23 +720,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;
 }
 



More information about the llvm-commits mailing list