https://github.com/qiongsiwu updated https://github.com/llvm/llvm-project/pull/136773
>From 7f39ebcc34fe3f40c2554ff7fa93baca5b4634a0 Mon Sep 17 00:00:00 2001 From: Qiongsi Wu <qiongsi...@apple.com> Date: Tue, 22 Apr 2025 14:17:15 -0700 Subject: [PATCH 1/5] Adding CXStringSet *createSet that takes a vector of StringRef as input. --- clang/tools/libclang/CXString.cpp | 10 +++++++++- clang/tools/libclang/CXString.h | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp index aaa8f8eeb67a1..7e46fcc3b8e69 100644 --- a/clang/tools/libclang/CXString.cpp +++ b/clang/tools/libclang/CXString.cpp @@ -107,7 +107,8 @@ CXString createCXString(CXStringBuf *buf) { return Str; } -CXStringSet *createSet(const std::vector<std::string> &Strings) { +template <typename StringTy> +static CXStringSet *createSetImpl(const std::vector<StringTy> &Strings) { CXStringSet *Set = new CXStringSet; Set->Count = Strings.size(); Set->Strings = new CXString[Set->Count]; @@ -116,6 +117,13 @@ CXStringSet *createSet(const std::vector<std::string> &Strings) { return Set; } +CXStringSet *createSet(const std::vector<std::string> &Strings) { + return createSetImpl(Strings); +} + +CXStringSet *createSet(const std::vector<StringRef> &Strings) { + return createSetImpl(Strings); +} //===----------------------------------------------------------------------===// // String pools. diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h index 809bdec3d677f..24c4092a9a2c0 100644 --- a/clang/tools/libclang/CXString.h +++ b/clang/tools/libclang/CXString.h @@ -67,7 +67,10 @@ CXString createRef(std::string String) = delete; /// Create a CXString object that is backed by a string buffer. CXString createCXString(CXStringBuf *buf); +/// Create a CXStringSet object owns the strings. Such an object should be +/// disposed with clang_disposeStringSet. CXStringSet *createSet(const std::vector<std::string> &Strings); +CXStringSet *createSet(const std::vector<StringRef> &Strings); /// A string pool used for fast allocation/deallocation of strings. class CXStringPool { >From 506c91d22bc6284a64f31a06a340110d5847def1 Mon Sep 17 00:00:00 2001 From: Qiongsi Wu <qiongsi...@apple.com> Date: Tue, 22 Apr 2025 16:19:57 -0700 Subject: [PATCH 2/5] Revise so that we can create an interface to avoid string copying. --- clang/tools/libclang/CXString.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp index 7e46fcc3b8e69..edfbe354c3331 100644 --- a/clang/tools/libclang/CXString.cpp +++ b/clang/tools/libclang/CXString.cpp @@ -107,22 +107,27 @@ CXString createCXString(CXStringBuf *buf) { return Str; } -template <typename StringTy> -static CXStringSet *createSetImpl(const std::vector<StringTy> &Strings) { +template <typename StringTy, bool Copy> +static CXStringSet *createSetImpl(ArrayRef<StringTy> Strings) { CXStringSet *Set = new CXStringSet; Set->Count = Strings.size(); Set->Strings = new CXString[Set->Count]; - for (unsigned SI = 0, SE = Set->Count; SI < SE; ++SI) - Set->Strings[SI] = createDup(Strings[SI]); + for (unsigned SI = 0, SE = Set->Count; SI < SE; ++SI) { + if constexpr (Copy) { + Set->Strings[SI] = createDup(Strings[SI]); + } else { + Set->Strings[SI] = createRef(Strings[SI]); + } + } return Set; } CXStringSet *createSet(const std::vector<std::string> &Strings) { - return createSetImpl(Strings); + return createSetImpl<std::string, true>(ArrayRef<std::string>(Strings)); } -CXStringSet *createSet(const std::vector<StringRef> &Strings) { - return createSetImpl(Strings); +CXStringSet *createRefSet(ArrayRef<StringRef> Strings) { + return createSetImpl<StringRef, false>(Strings); } //===----------------------------------------------------------------------===// >From f3df9577b152794708056c379c08bbe306d86e6e Mon Sep 17 00:00:00 2001 From: Qiongsi Wu <qiongsi...@apple.com> Date: Tue, 22 Apr 2025 16:22:25 -0700 Subject: [PATCH 3/5] Fix function prototype. --- clang/tools/libclang/CXString.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h index 24c4092a9a2c0..4662ab75f1286 100644 --- a/clang/tools/libclang/CXString.h +++ b/clang/tools/libclang/CXString.h @@ -70,7 +70,7 @@ CXString createCXString(CXStringBuf *buf); /// Create a CXStringSet object owns the strings. Such an object should be /// disposed with clang_disposeStringSet. CXStringSet *createSet(const std::vector<std::string> &Strings); -CXStringSet *createSet(const std::vector<StringRef> &Strings); +CXStringSet *createRefSet(ArrayRef<StringRef> Strings); /// A string pool used for fast allocation/deallocation of strings. class CXStringPool { >From ea4e8c60a99af5c00c6647bc0ff6d22b05bb508b Mon Sep 17 00:00:00 2001 From: Qiongsi Wu <qiongsi...@apple.com> Date: Wed, 23 Apr 2025 08:28:24 -0700 Subject: [PATCH 4/5] Updating comments. --- clang/tools/libclang/CXString.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clang/tools/libclang/CXString.h b/clang/tools/libclang/CXString.h index 4662ab75f1286..c20b68a83c29e 100644 --- a/clang/tools/libclang/CXString.h +++ b/clang/tools/libclang/CXString.h @@ -67,9 +67,12 @@ CXString createRef(std::string String) = delete; /// Create a CXString object that is backed by a string buffer. CXString createCXString(CXStringBuf *buf); -/// Create a CXStringSet object owns the strings. Such an object should be +/// Create a CXStringSet object that owns the strings. Such an object should be /// disposed with clang_disposeStringSet. CXStringSet *createSet(const std::vector<std::string> &Strings); + +/// Create a CXStringSet object that does not own the strings. Such an object +/// should still be disposed with clang_disposeStringSet. CXStringSet *createRefSet(ArrayRef<StringRef> Strings); /// A string pool used for fast allocation/deallocation of strings. @@ -108,4 +111,3 @@ static inline StringRef getContents(const CXUnsavedFile &UF) { } #endif - >From cf7ed08f838508b9f98f0e519fec9bc68f152e07 Mon Sep 17 00:00:00 2001 From: Qiongsi Wu <qiongsi...@apple.com> Date: Wed, 23 Apr 2025 10:16:34 -0700 Subject: [PATCH 5/5] Remove unnecessary ArrayRef constructor. --- clang/tools/libclang/CXString.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/tools/libclang/CXString.cpp b/clang/tools/libclang/CXString.cpp index edfbe354c3331..d240c255e49b1 100644 --- a/clang/tools/libclang/CXString.cpp +++ b/clang/tools/libclang/CXString.cpp @@ -123,7 +123,7 @@ static CXStringSet *createSetImpl(ArrayRef<StringTy> Strings) { } CXStringSet *createSet(const std::vector<std::string> &Strings) { - return createSetImpl<std::string, true>(ArrayRef<std::string>(Strings)); + return createSetImpl<std::string, true>(Strings); } CXStringSet *createRefSet(ArrayRef<StringRef> Strings) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits