[clang] [clang][tools] Handle weak (and duplicate) symbols in clang-extdef-mapping (PR #222010)

Balázs Kéri via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 11 06:03:14 PDT 2026


https://github.com/balazske updated https://github.com/llvm/llvm-project/pull/222010

>From 92a25127d30c047cc53140f9553a1b0d38c2383b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bal=C3=A1zs=20K=C3=A9ri?= <balazs.keri at ericsson.com>
Date: Tue, 8 Sep 2026 16:15:15 +0200
Subject: [PATCH 1/4] [clang][tools] Handle weak (and duplicate) symbols in
 clang-extdef-mapping

Change: Data is now collected from all AST files and printed at the end only.
Names with "weak" attribute are overridden with same name without it
(if one exists). Other duplicate names are written only once to the output.
---
 .../ClangExtDefMapGen.cpp                     | 33 +++++++++++++------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp b/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp
index e1d8605ece28a..781f5f83c5525 100644
--- a/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp
+++ b/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp
@@ -43,25 +43,26 @@ class MapExtDefNamesConsumer : public ASTConsumer {
     CurrentFileName = astFilePath.str();
   }
 
-  ~MapExtDefNamesConsumer() {
-    // Flush results to standard output.
-    llvm::outs() << createCrossTUIndexString(Index);
-  }
-
   void HandleTranslationUnit(ASTContext &Context) override {
     handleDecl(Context.getTranslationUnitDecl());
   }
 
+  static void printIndex() { llvm::outs() << createCrossTUIndexString(Index); }
+
 private:
   void handleDecl(const Decl *D);
   void addIfInMain(const DeclaratorDecl *DD, SourceLocation defStart);
 
   ASTContext &Ctx;
   SourceManager &SM;
-  llvm::StringMap<std::string> Index;
+  static llvm::StringMap<std::string> Index;
+  static llvm::StringSet<> WeakNames;
   std::string CurrentFileName;
 };
 
+llvm::StringMap<std::string> MapExtDefNamesConsumer::Index;
+llvm::StringSet<> MapExtDefNamesConsumer::WeakNames;
+
 void MapExtDefNamesConsumer::handleDecl(const Decl *D) {
   if (!D)
     return;
@@ -100,8 +101,17 @@ void MapExtDefNamesConsumer::addIfInMain(const DeclaratorDecl *DD,
   case Linkage::External:
   case Linkage::VisibleNone:
   case Linkage::UniqueExternal:
-    if (SM.isInMainFile(defStart))
-      Index[*LookupName] = CurrentFileName;
+    if (SM.isInMainFile(defStart)) {
+      if (!DD->hasAttr<WeakAttr>()) {
+        Index[*LookupName] = CurrentFileName;
+        WeakNames.erase(*LookupName);
+      } else {
+        if (!Index.contains(*LookupName)) {
+          Index[*LookupName] = CurrentFileName;
+          WeakNames.insert(*LookupName);
+        }
+      }
+    }
     break;
   case Linkage::Invalid:
     llvm_unreachable("Linkage has not been computed!");
@@ -190,12 +200,15 @@ static int HandleFiles(ArrayRef<std::string> SourceFiles,
     }
   }
 
+  int Ret = 0;
   if (!SourcesToBeParsed.empty()) {
     ClangTool Tool(compilations, SourcesToBeParsed);
-    return Tool.run(newFrontendActionFactory<MapExtDefNamesAction>().get());
+    Ret = Tool.run(newFrontendActionFactory<MapExtDefNamesAction>().get());
   }
 
-  return 0;
+  MapExtDefNamesConsumer::printIndex();
+
+  return Ret;
 }
 
 int main(int argc, const char **argv) {

>From cf85fa557a10679ede98b1a66b1b63e265166b17 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bal=C3=A1zs=20K=C3=A9ri?= <balazs.keri at ericsson.com>
Date: Tue, 8 Sep 2026 16:27:54 +0200
Subject: [PATCH 2/4] added test files

---
 .../test/Analysis/ctu/test-strong-weak-sym.c  | 42 +++++++++++++++
 .../test/Analysis/ctu/test-weak-strong-sym.c  | 42 +++++++++++++++
 .../Analysis/ctu/test-weak-strong-weak-sym.c  | 51 +++++++++++++++++++
 clang/test/Analysis/ctu/test-weak-weak-sym.c  | 44 ++++++++++++++++
 4 files changed, 179 insertions(+)
 create mode 100644 clang/test/Analysis/ctu/test-strong-weak-sym.c
 create mode 100644 clang/test/Analysis/ctu/test-weak-strong-sym.c
 create mode 100644 clang/test/Analysis/ctu/test-weak-strong-weak-sym.c
 create mode 100644 clang/test/Analysis/ctu/test-weak-weak-sym.c

diff --git a/clang/test/Analysis/ctu/test-strong-weak-sym.c b/clang/test/Analysis/ctu/test-strong-weak-sym.c
new file mode 100644
index 0000000000000..bac41caf93e0b
--- /dev/null
+++ b/clang/test/Analysis/ctu/test-strong-weak-sym.c
@@ -0,0 +1,42 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -x c -emit-pch -o %t/a.c.ast %t/a.c
+// RUN: %clang_cc1 -x c -emit-pch -o %t/b.c.ast %t/b.c
+
+// RUN: %clang_extdef_map %t/a.c %t/b.c -- -c -x c > %t/externalDefMap.tmp1.txt
+// RUN: sed -e 's|\.c$|.c.ast|g' %t/externalDefMap.tmp1.txt > %t/externalDefMap.tmp2.txt
+// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp2.txt > %t/externalDefMap.txt
+
+// RUN: %clang_cc1 -analyze -triple x86_64-pc-linux-gnu \
+// RUN:   -analyzer-checker=core \
+// RUN:   -analyzer-config experimental-enable-naive-ctu-analysis=true \
+// RUN:   -analyzer-config display-ctu-progress=true \
+// RUN:   -analyzer-config ctu-dir=%t \
+// RUN:   -verify %t/main.c 2>&1 | FileCheck %s
+
+//--- main.c
+
+// expected-no-diagnostics
+// CHECK: CTU loaded AST file: a.c.ast
+
+int fn(void);
+
+int main(int argc, char* argv[]) {
+  return fn();
+}
+
+//--- a.c
+
+int fn(void) {
+   return 1;
+}
+
+//--- b.c
+
+int fn(void) __attribute__((weak));
+
+int fn(void) {
+   return 0;
+}
diff --git a/clang/test/Analysis/ctu/test-weak-strong-sym.c b/clang/test/Analysis/ctu/test-weak-strong-sym.c
new file mode 100644
index 0000000000000..2397e4988a22a
--- /dev/null
+++ b/clang/test/Analysis/ctu/test-weak-strong-sym.c
@@ -0,0 +1,42 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -x c -emit-pch -o %t/a.c.ast %t/a.c
+// RUN: %clang_cc1 -x c -emit-pch -o %t/b.c.ast %t/b.c
+
+// RUN: %clang_extdef_map %t/a.c %t/b.c -- -c -x c > %t/externalDefMap.tmp1.txt
+// RUN: sed -e 's|\.c$|.c.ast|g' %t/externalDefMap.tmp1.txt > %t/externalDefMap.tmp2.txt
+// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp2.txt > %t/externalDefMap.txt
+
+// RUN: %clang_cc1 -analyze -triple x86_64-pc-linux-gnu \
+// RUN:   -analyzer-checker=core \
+// RUN:   -analyzer-config experimental-enable-naive-ctu-analysis=true \
+// RUN:   -analyzer-config display-ctu-progress=true \
+// RUN:   -analyzer-config ctu-dir=%t \
+// RUN:   -verify %t/main.c 2>&1 | FileCheck %s
+
+//--- main.c
+
+// expected-no-diagnostics
+// CHECK: CTU loaded AST file: b.c.ast
+
+int fn(void);
+
+int main(int argc, char* argv[]) {
+  return fn();
+}
+
+//--- a.c
+
+int fn(void) __attribute__((weak));
+
+int fn(void) {
+   return 1;
+}
+
+//--- b.c
+
+int fn(void) {
+   return 0;
+}
diff --git a/clang/test/Analysis/ctu/test-weak-strong-weak-sym.c b/clang/test/Analysis/ctu/test-weak-strong-weak-sym.c
new file mode 100644
index 0000000000000..446bd15d74cc0
--- /dev/null
+++ b/clang/test/Analysis/ctu/test-weak-strong-weak-sym.c
@@ -0,0 +1,51 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -x c -emit-pch -o %t/a.c.ast %t/a.c
+// RUN: %clang_cc1 -x c -emit-pch -o %t/b.c.ast %t/b.c
+// RUN: %clang_cc1 -x c -emit-pch -o %t/c.c.ast %t/c.c
+
+// RUN: %clang_extdef_map %t/a.c %t/b.c %t/c.c -- -c -x c > %t/externalDefMap.tmp1.txt
+// RUN: sed -e 's|\.c$|.c.ast|g' %t/externalDefMap.tmp1.txt > %t/externalDefMap.tmp2.txt
+// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp2.txt > %t/externalDefMap.txt
+
+// RUN: %clang_cc1 -analyze -triple x86_64-pc-linux-gnu \
+// RUN:   -analyzer-checker=core \
+// RUN:   -analyzer-config experimental-enable-naive-ctu-analysis=true \
+// RUN:   -analyzer-config display-ctu-progress=true \
+// RUN:   -analyzer-config ctu-dir=%t \
+// RUN:   -verify %t/main.c 2>&1 | FileCheck %s
+
+//--- main.c
+
+// expected-no-diagnostics
+// CHECK: CTU loaded AST file: b.c.ast
+
+int fn(void);
+
+int main(int argc, char* argv[]) {
+  return fn();
+}
+
+//--- a.c
+
+int fn(void) __attribute__((weak));
+
+int fn(void) {
+   return 0;
+}
+
+//--- b.c
+
+int fn(void) {
+   return 1;
+}
+
+//--- c.c
+
+int fn(void) __attribute__((weak));
+
+int fn(void) {
+   return 0;
+}
diff --git a/clang/test/Analysis/ctu/test-weak-weak-sym.c b/clang/test/Analysis/ctu/test-weak-weak-sym.c
new file mode 100644
index 0000000000000..ebc1f377d1295
--- /dev/null
+++ b/clang/test/Analysis/ctu/test-weak-weak-sym.c
@@ -0,0 +1,44 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -x c -emit-pch -o %t/a.c.ast %t/a.c
+// RUN: %clang_cc1 -x c -emit-pch -o %t/b.c.ast %t/b.c
+
+// RUN: %clang_extdef_map %t/a.c %t/b.c -- -c -x c > %t/externalDefMap.tmp1.txt
+// RUN: sed -e 's|\.c$|.c.ast|g' %t/externalDefMap.tmp1.txt > %t/externalDefMap.tmp2.txt
+// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp2.txt > %t/externalDefMap.txt
+
+// RUN: %clang_cc1 -analyze -triple x86_64-pc-linux-gnu \
+// RUN:   -analyzer-checker=core \
+// RUN:   -analyzer-config experimental-enable-naive-ctu-analysis=true \
+// RUN:   -analyzer-config display-ctu-progress=true \
+// RUN:   -analyzer-config ctu-dir=%t \
+// RUN:   -verify %t/main.c 2>&1 | FileCheck %s
+
+//--- main.c
+
+// expected-no-diagnostics
+// CHECK: CTU loaded AST file: a.c.ast
+
+int fn(void);
+
+int main(int argc, char* argv[]) {
+  return fn();
+}
+
+//--- a.c
+
+int fn(void) __attribute__((weak));
+
+int fn(void) {
+   return 0;
+}
+
+//--- b.c
+
+int fn(void) __attribute__((weak));
+
+int fn(void) {
+   return 0;
+}

>From e87a3f5dd56a99347b5888346db075e5c2bef9c2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bal=C3=A1zs=20K=C3=A9ri?= <balazs.keri at ericsson.com>
Date: Thu, 10 Sep 2026 12:14:15 +0200
Subject: [PATCH 3/4] using non-static index data, warning on duplicate

---
 .../clang/Basic/DiagnosticCrossTUKinds.td     |  4 +
 .../ClangExtDefMapGen.cpp                     | 92 +++++++++++++------
 2 files changed, 69 insertions(+), 27 deletions(-)

diff --git a/clang/include/clang/Basic/DiagnosticCrossTUKinds.td b/clang/include/clang/Basic/DiagnosticCrossTUKinds.td
index 13498a7f16ac8..801c47027fe11 100644
--- a/clang/include/clang/Basic/DiagnosticCrossTUKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCrossTUKinds.td
@@ -46,4 +46,8 @@ def remark_ctu_import_threshold_reached: Remark<
 def warn_ctu_incompat_lang : Warning<
   "imported AST from '%0' had been generated for a different language, "
   "current: %1, imported: %2">, InGroup<CrossTU>;
+
+def warn_multiple_def_index : Warning<
+  "multiple definitions are found for the same key during generating index, "
+  "previous definition found in '%0'">;
 }
diff --git a/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp b/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp
index 781f5f83c5525..01b3bf1672544 100644
--- a/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp
+++ b/clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp
@@ -15,6 +15,7 @@
 #include "clang/AST/ASTContext.h"
 #include "clang/Basic/DiagnosticOptions.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/CrossTU/CrossTUDiagnostic.h"
 #include "clang/CrossTU/CrossTranslationUnit.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/TextDiagnosticPrinter.h"
@@ -35,11 +36,40 @@ using namespace clang::tooling;
 static cl::OptionCategory
     ClangExtDefMapGenCategory("clang-extdef-mapping options");
 
+class ExtDefNameMap {
+  llvm::StringMap<std::string> Index;
+  llvm::StringSet<> WeakNames;
+
+public:
+  bool addName(const std::string &USR, bool IsWeak,
+               const std::string &FileName) {
+    bool NameExists = Index.contains(USR);
+    if (IsWeak) {
+      if (!NameExists) {
+        Index[USR] = FileName;
+        WeakNames.insert(USR);
+      }
+    } else {
+      bool ExistingIsWeak = WeakNames.erase(USR);
+      if (NameExists && !ExistingIsWeak)
+        return false;
+      Index[USR] = FileName;
+    }
+    return true;
+  }
+
+  const std::string &lookupName(const std::string &USR) const {
+    return Index.at(USR);
+  }
+
+  void printIndex() const { llvm::outs() << createCrossTUIndexString(Index); }
+};
+
 class MapExtDefNamesConsumer : public ASTConsumer {
 public:
-  MapExtDefNamesConsumer(ASTContext &Context,
+  MapExtDefNamesConsumer(ExtDefNameMap &NMap, ASTContext &Context,
                          StringRef astFilePath = StringRef())
-      : Ctx(Context), SM(Context.getSourceManager()) {
+      : Ctx(Context), SM(Context.getSourceManager()), NameMap(NMap) {
     CurrentFileName = astFilePath.str();
   }
 
@@ -47,22 +77,16 @@ class MapExtDefNamesConsumer : public ASTConsumer {
     handleDecl(Context.getTranslationUnitDecl());
   }
 
-  static void printIndex() { llvm::outs() << createCrossTUIndexString(Index); }
-
 private:
   void handleDecl(const Decl *D);
   void addIfInMain(const DeclaratorDecl *DD, SourceLocation defStart);
 
   ASTContext &Ctx;
   SourceManager &SM;
-  static llvm::StringMap<std::string> Index;
-  static llvm::StringSet<> WeakNames;
   std::string CurrentFileName;
+  ExtDefNameMap &NameMap;
 };
 
-llvm::StringMap<std::string> MapExtDefNamesConsumer::Index;
-llvm::StringSet<> MapExtDefNamesConsumer::WeakNames;
-
 void MapExtDefNamesConsumer::handleDecl(const Decl *D) {
   if (!D)
     return;
@@ -102,14 +126,11 @@ void MapExtDefNamesConsumer::addIfInMain(const DeclaratorDecl *DD,
   case Linkage::VisibleNone:
   case Linkage::UniqueExternal:
     if (SM.isInMainFile(defStart)) {
-      if (!DD->hasAttr<WeakAttr>()) {
-        Index[*LookupName] = CurrentFileName;
-        WeakNames.erase(*LookupName);
-      } else {
-        if (!Index.contains(*LookupName)) {
-          Index[*LookupName] = CurrentFileName;
-          WeakNames.insert(*LookupName);
-        }
+      if (!NameMap.addName(*LookupName, DD->hasAttr<WeakAttr>(),
+                           CurrentFileName)) {
+        Ctx.getDiagnostics().Report(DD->getLocation(),
+                                    diag::warn_multiple_def_index)
+            << NameMap.lookupName(*LookupName);
       }
     }
     break;
@@ -121,11 +142,29 @@ void MapExtDefNamesConsumer::addIfInMain(const DeclaratorDecl *DD,
 }
 
 class MapExtDefNamesAction : public ASTFrontendAction {
+public:
+  MapExtDefNamesAction(ExtDefNameMap &NMap) : NameMap(NMap) {}
+
 protected:
   std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
                                                  llvm::StringRef) override {
-    return std::make_unique<MapExtDefNamesConsumer>(CI.getASTContext());
+    return std::make_unique<MapExtDefNamesConsumer>(NameMap,
+                                                    CI.getASTContext());
   }
+
+private:
+  ExtDefNameMap &NameMap;
+};
+
+class MapExtDefNamesActionFactory : public FrontendActionFactory {
+public:
+  MapExtDefNamesActionFactory(ExtDefNameMap &NMap) : NameMap(NMap) {}
+  std::unique_ptr<FrontendAction> create() override {
+    return std::make_unique<MapExtDefNamesAction>(NameMap);
+  };
+
+private:
+  ExtDefNameMap &NameMap;
 };
 
 static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
@@ -155,7 +194,7 @@ GetDiagnosticsEngine(DiagnosticOptions &DiagOpts) {
 
 static CompilerInstance *CI = nullptr;
 
-static bool HandleAST(StringRef AstPath) {
+static bool HandleAST(ExtDefNameMap &NMap, StringRef AstPath) {
 
   if (!CI)
     CI = new CompilerInstance();
@@ -177,7 +216,7 @@ static bool HandleAST(StringRef AstPath) {
   FM.makeAbsolutePath(AbsPath);
 
   MapExtDefNamesConsumer Consumer =
-      MapExtDefNamesConsumer(Unit->getASTContext(), AbsPath);
+      MapExtDefNamesConsumer(NMap, Unit->getASTContext(), AbsPath);
   Consumer.HandleTranslationUnit(Unit->getASTContext());
 
   return true;
@@ -185,6 +224,7 @@ static bool HandleAST(StringRef AstPath) {
 
 static int HandleFiles(ArrayRef<std::string> SourceFiles,
                        CompilationDatabase &compilations) {
+  ExtDefNameMap NameMap;
   std::vector<std::string> SourcesToBeParsed;
 
   // Loop over all input files, if they are pre-compiled AST
@@ -192,7 +232,7 @@ static int HandleFiles(ArrayRef<std::string> SourceFiles,
   // on a list for ClangTool to handle.
   for (StringRef Src : SourceFiles) {
     if (Src.ends_with(".ast")) {
-      if (!HandleAST(Src)) {
+      if (!HandleAST(NameMap, Src)) {
         return 1;
       }
     } else {
@@ -200,13 +240,11 @@ static int HandleFiles(ArrayRef<std::string> SourceFiles,
     }
   }
 
-  int Ret = 0;
-  if (!SourcesToBeParsed.empty()) {
-    ClangTool Tool(compilations, SourcesToBeParsed);
-    Ret = Tool.run(newFrontendActionFactory<MapExtDefNamesAction>().get());
-  }
+  MapExtDefNamesActionFactory Factory(NameMap);
+  ClangTool Tool(compilations, SourcesToBeParsed);
+  int Ret = Tool.run(&Factory);
 
-  MapExtDefNamesConsumer::printIndex();
+  NameMap.printIndex();
 
   return Ret;
 }

>From 243f437ceccd479b0b5f63547dfea8e1c0ccaf7d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bal=C3=A1zs=20K=C3=A9ri?= <balazs.keri at ericsson.com>
Date: Fri, 11 Sep 2026 12:50:43 +0200
Subject: [PATCH 4/4] improved tests

---
 .../ctu/weak-name-handling/strong-strong.c    | 47 +++++++++++++++++++
 .../strong-weak.c}                            | 17 +++++--
 .../weak-strong-weak.c}                       | 17 +++++--
 .../weak-strong.c}                            | 17 +++++--
 .../weak-weak.c}                              | 17 +++++--
 5 files changed, 95 insertions(+), 20 deletions(-)
 create mode 100644 clang/test/Analysis/ctu/weak-name-handling/strong-strong.c
 rename clang/test/Analysis/ctu/{test-strong-weak-sym.c => weak-name-handling/strong-weak.c} (64%)
 rename clang/test/Analysis/ctu/{test-weak-strong-weak-sym.c => weak-name-handling/weak-strong-weak.c} (68%)
 rename clang/test/Analysis/ctu/{test-weak-strong-sym.c => weak-name-handling/weak-strong.c} (64%)
 rename clang/test/Analysis/ctu/{test-weak-weak-sym.c => weak-name-handling/weak-weak.c} (66%)

diff --git a/clang/test/Analysis/ctu/weak-name-handling/strong-strong.c b/clang/test/Analysis/ctu/weak-name-handling/strong-strong.c
new file mode 100644
index 0000000000000..99e49ce110013
--- /dev/null
+++ b/clang/test/Analysis/ctu/weak-name-handling/strong-strong.c
@@ -0,0 +1,47 @@
+// RUN: rm -rf %t
+// RUN: mkdir -p %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -x c -emit-pch -o %t/a.c.ast %t/a.c
+// RUN: %clang_cc1 -x c -emit-pch -o %t/b.c.ast %t/b.c
+
+// RUN: %clang_extdef_map %t/a.c.ast %t/b.c.ast > %t/externalDefMap.tmp.txt 2> %t/extdef_err.txt
+// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp.txt > %t/externalDefMap.txt
+// RUN: sed -e 's|%t\/||g' %t/extdef_err.txt | FileCheck %t/extdef_check
+
+// RUN: %clang_cc1 -analyze -triple x86_64-pc-linux-gnu \
+// RUN:   -analyzer-checker=core \
+// RUN:   -analyzer-config experimental-enable-naive-ctu-analysis=true \
+// RUN:   -analyzer-config display-ctu-progress=true \
+// RUN:   -analyzer-config ctu-dir=%t \
+// RUN:   -verify %t/main.c 2>&1 | FileCheck %t/main_check
+
+//--- extdef_check
+
+// CHECK: b.c:2:5: warning: multiple definitions are found for the same key during generating index, previous definition found in 'a.c.ast'
+
+//--- main_check
+
+// CHECK: CTU loaded AST file: a.c.ast
+
+//--- main.c
+
+// expected-no-diagnostics
+
+int fn(void);
+
+int main(int argc, char* argv[]) {
+  return fn();
+}
+
+//--- a.c
+
+int fn(void) {
+   return 0;
+}
+
+//--- b.c
+
+int fn(void) {
+   return 0;
+}
diff --git a/clang/test/Analysis/ctu/test-strong-weak-sym.c b/clang/test/Analysis/ctu/weak-name-handling/strong-weak.c
similarity index 64%
rename from clang/test/Analysis/ctu/test-strong-weak-sym.c
rename to clang/test/Analysis/ctu/weak-name-handling/strong-weak.c
index bac41caf93e0b..06ef6dcee1f7f 100644
--- a/clang/test/Analysis/ctu/test-strong-weak-sym.c
+++ b/clang/test/Analysis/ctu/weak-name-handling/strong-weak.c
@@ -5,21 +5,28 @@
 // RUN: %clang_cc1 -x c -emit-pch -o %t/a.c.ast %t/a.c
 // RUN: %clang_cc1 -x c -emit-pch -o %t/b.c.ast %t/b.c
 
-// RUN: %clang_extdef_map %t/a.c %t/b.c -- -c -x c > %t/externalDefMap.tmp1.txt
-// RUN: sed -e 's|\.c$|.c.ast|g' %t/externalDefMap.tmp1.txt > %t/externalDefMap.tmp2.txt
-// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp2.txt > %t/externalDefMap.txt
+// RUN: %clang_extdef_map %t/a.c.ast %t/b.c.ast > %t/externalDefMap.tmp.txt 2> %t/extdef_err.txt
+// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp.txt > %t/externalDefMap.txt
+// RUN: sed -e 's|%t\/||g' %t/extdef_err.txt | FileCheck --allow-empty %t/extdef_check
 
 // RUN: %clang_cc1 -analyze -triple x86_64-pc-linux-gnu \
 // RUN:   -analyzer-checker=core \
 // RUN:   -analyzer-config experimental-enable-naive-ctu-analysis=true \
 // RUN:   -analyzer-config display-ctu-progress=true \
 // RUN:   -analyzer-config ctu-dir=%t \
-// RUN:   -verify %t/main.c 2>&1 | FileCheck %s
+// RUN:   -verify %t/main.c 2>&1 | FileCheck %t/main_check
+
+//--- extdef_check
+
+// CHECK-NOT: warning
+
+//--- main_check
+
+// CHECK: CTU loaded AST file: a.c.ast
 
 //--- main.c
 
 // expected-no-diagnostics
-// CHECK: CTU loaded AST file: a.c.ast
 
 int fn(void);
 
diff --git a/clang/test/Analysis/ctu/test-weak-strong-weak-sym.c b/clang/test/Analysis/ctu/weak-name-handling/weak-strong-weak.c
similarity index 68%
rename from clang/test/Analysis/ctu/test-weak-strong-weak-sym.c
rename to clang/test/Analysis/ctu/weak-name-handling/weak-strong-weak.c
index 446bd15d74cc0..785cdd510460e 100644
--- a/clang/test/Analysis/ctu/test-weak-strong-weak-sym.c
+++ b/clang/test/Analysis/ctu/weak-name-handling/weak-strong-weak.c
@@ -6,21 +6,28 @@
 // RUN: %clang_cc1 -x c -emit-pch -o %t/b.c.ast %t/b.c
 // RUN: %clang_cc1 -x c -emit-pch -o %t/c.c.ast %t/c.c
 
-// RUN: %clang_extdef_map %t/a.c %t/b.c %t/c.c -- -c -x c > %t/externalDefMap.tmp1.txt
-// RUN: sed -e 's|\.c$|.c.ast|g' %t/externalDefMap.tmp1.txt > %t/externalDefMap.tmp2.txt
-// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp2.txt > %t/externalDefMap.txt
+// RUN: %clang_extdef_map %t/a.c.ast %t/b.c.ast %t/c.c.ast > %t/externalDefMap.tmp.txt 2> %t/extdef_err.txt
+// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp.txt > %t/externalDefMap.txt
+// RUN: sed -e 's|%t\/||g' %t/extdef_err.txt | FileCheck --allow-empty %t/extdef_check
 
 // RUN: %clang_cc1 -analyze -triple x86_64-pc-linux-gnu \
 // RUN:   -analyzer-checker=core \
 // RUN:   -analyzer-config experimental-enable-naive-ctu-analysis=true \
 // RUN:   -analyzer-config display-ctu-progress=true \
 // RUN:   -analyzer-config ctu-dir=%t \
-// RUN:   -verify %t/main.c 2>&1 | FileCheck %s
+// RUN:   -verify %t/main.c 2>&1 | FileCheck %t/main_check
+
+//--- extdef_check
+
+// CHECK-NOT: warning
+
+//--- main_check
+
+// CHECK: CTU loaded AST file: b.c.ast
 
 //--- main.c
 
 // expected-no-diagnostics
-// CHECK: CTU loaded AST file: b.c.ast
 
 int fn(void);
 
diff --git a/clang/test/Analysis/ctu/test-weak-strong-sym.c b/clang/test/Analysis/ctu/weak-name-handling/weak-strong.c
similarity index 64%
rename from clang/test/Analysis/ctu/test-weak-strong-sym.c
rename to clang/test/Analysis/ctu/weak-name-handling/weak-strong.c
index 2397e4988a22a..03a6b07043d79 100644
--- a/clang/test/Analysis/ctu/test-weak-strong-sym.c
+++ b/clang/test/Analysis/ctu/weak-name-handling/weak-strong.c
@@ -5,21 +5,28 @@
 // RUN: %clang_cc1 -x c -emit-pch -o %t/a.c.ast %t/a.c
 // RUN: %clang_cc1 -x c -emit-pch -o %t/b.c.ast %t/b.c
 
-// RUN: %clang_extdef_map %t/a.c %t/b.c -- -c -x c > %t/externalDefMap.tmp1.txt
-// RUN: sed -e 's|\.c$|.c.ast|g' %t/externalDefMap.tmp1.txt > %t/externalDefMap.tmp2.txt
-// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp2.txt > %t/externalDefMap.txt
+// RUN: %clang_extdef_map %t/a.c.ast %t/b.c.ast > %t/externalDefMap.tmp.txt 2> %t/extdef_err.txt
+// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp.txt > %t/externalDefMap.txt
+// RUN: sed -e 's|%t\/||g' %t/extdef_err.txt | FileCheck --allow-empty %t/extdef_check
 
 // RUN: %clang_cc1 -analyze -triple x86_64-pc-linux-gnu \
 // RUN:   -analyzer-checker=core \
 // RUN:   -analyzer-config experimental-enable-naive-ctu-analysis=true \
 // RUN:   -analyzer-config display-ctu-progress=true \
 // RUN:   -analyzer-config ctu-dir=%t \
-// RUN:   -verify %t/main.c 2>&1 | FileCheck %s
+// RUN:   -verify %t/main.c 2>&1 | FileCheck %t/main_check
+
+//--- extdef_check
+
+// CHECK-NOT: warning
+
+//--- main_check
+
+// CHECK: CTU loaded AST file: b.c.ast
 
 //--- main.c
 
 // expected-no-diagnostics
-// CHECK: CTU loaded AST file: b.c.ast
 
 int fn(void);
 
diff --git a/clang/test/Analysis/ctu/test-weak-weak-sym.c b/clang/test/Analysis/ctu/weak-name-handling/weak-weak.c
similarity index 66%
rename from clang/test/Analysis/ctu/test-weak-weak-sym.c
rename to clang/test/Analysis/ctu/weak-name-handling/weak-weak.c
index ebc1f377d1295..33073a5e9cca2 100644
--- a/clang/test/Analysis/ctu/test-weak-weak-sym.c
+++ b/clang/test/Analysis/ctu/weak-name-handling/weak-weak.c
@@ -5,21 +5,28 @@
 // RUN: %clang_cc1 -x c -emit-pch -o %t/a.c.ast %t/a.c
 // RUN: %clang_cc1 -x c -emit-pch -o %t/b.c.ast %t/b.c
 
-// RUN: %clang_extdef_map %t/a.c %t/b.c -- -c -x c > %t/externalDefMap.tmp1.txt
-// RUN: sed -e 's|\.c$|.c.ast|g' %t/externalDefMap.tmp1.txt > %t/externalDefMap.tmp2.txt
-// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp2.txt > %t/externalDefMap.txt
+// RUN: %clang_extdef_map %t/a.c.ast %t/b.c.ast > %t/externalDefMap.tmp.txt 2> %t/extdef_err.txt
+// RUN: sed -e 's|%t\/||g' %t/externalDefMap.tmp.txt > %t/externalDefMap.txt
+// RUN: sed -e 's|%t\/||g' %t/extdef_err.txt | FileCheck --allow-empty %t/extdef_check
 
 // RUN: %clang_cc1 -analyze -triple x86_64-pc-linux-gnu \
 // RUN:   -analyzer-checker=core \
 // RUN:   -analyzer-config experimental-enable-naive-ctu-analysis=true \
 // RUN:   -analyzer-config display-ctu-progress=true \
 // RUN:   -analyzer-config ctu-dir=%t \
-// RUN:   -verify %t/main.c 2>&1 | FileCheck %s
+// RUN:   -verify %t/main.c 2>&1 | FileCheck %t/main_check
+
+//--- extdef_check
+
+// CHECK-NOT: warning
+
+//--- main_check
+
+// CHECK: CTU loaded AST file: a.c.ast
 
 //--- main.c
 
 // expected-no-diagnostics
-// CHECK: CTU loaded AST file: a.c.ast
 
 int fn(void);
 



More information about the cfe-commits mailing list