[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-03 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 15829b45f1de4beba3fabb3dd723786b641f850b Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a6eb87ab7d8aa..8fabef174bca5 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13847,6 +13847,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index ef3326fcb0c18..53f0d8113911d 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -41,7 +41,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 std::make_unique(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter.get();
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From c2fd1abfa8e03542acac1702dfe41fb1594c4676 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 8fabef174bca5..b353c5bd6753d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13841,6 +13841,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCache

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-03 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 15829b45f1de4beba3fabb3dd723786b641f850b Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a6eb87ab7d8aa..8fabef174bca5 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13847,6 +13847,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index ef3326fcb0c18..53f0d8113911d 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -41,7 +41,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 std::make_unique(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter.get();
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From c2fd1abfa8e03542acac1702dfe41fb1594c4676 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 8fabef174bca5..b353c5bd6753d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13841,6 +13841,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCache

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-03 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 618273757e1c6132ddd7e8dc880cd045802a8a07 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a6eb87ab7d8aa..8fabef174bca5 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13847,6 +13847,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index ef3326fcb0c18..53f0d8113911d 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -41,7 +41,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 std::make_unique(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter.get();
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From e26c6d0f2e68d927db631a0eee5cc3254caa6fe7 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 8fabef174bca5..b353c5bd6753d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13841,6 +13841,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCache

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-03 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 618273757e1c6132ddd7e8dc880cd045802a8a07 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a6eb87ab7d8aa..8fabef174bca5 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13847,6 +13847,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index ef3326fcb0c18..53f0d8113911d 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -41,7 +41,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 std::make_unique(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter.get();
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From e26c6d0f2e68d927db631a0eee5cc3254caa6fe7 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 8fabef174bca5..b353c5bd6753d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13841,6 +13841,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCache

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-03 Thread Sergei Barannikov via llvm-branch-commits

https://github.com/s-barannikov commented:

There is a related `Sema::BuildPredefinedExpr()` that handles predefined macros 
like `__FUNCTION__`. I guess it needs a similar update.


https://github.com/llvm/llvm-project/pull/196569
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-03 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 22cf62ab82480e8d91e3dfe56c34727b89abc081 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a6eb87ab7d8aa..8fabef174bca5 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13847,6 +13847,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index ef3326fcb0c18..53f0d8113911d 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -41,7 +41,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 std::make_unique(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter.get();
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 2056cb24b74c2dc3bde6d54c04518089dc5c2b4f Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 8fabef174bca5..b353c5bd6753d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13841,6 +13841,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCache

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-03 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 22cf62ab82480e8d91e3dfe56c34727b89abc081 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a6eb87ab7d8aa..8fabef174bca5 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13847,6 +13847,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index ef3326fcb0c18..53f0d8113911d 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -41,7 +41,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 std::make_unique(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter.get();
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 2056cb24b74c2dc3bde6d54c04518089dc5c2b4f Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 8fabef174bca5..b353c5bd6753d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13841,6 +13841,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCache

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-02 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 7660b6cfd000ecd0acc8440cee38e105f06011f0 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a6eb87ab7d8aa..8fabef174bca5 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13847,6 +13847,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index a3f0484ddde84..2e7e4ed1ac63f 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 0c3d2b459a7063febe9e5fc3f5e6bad5112227aa Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 8fabef174bca5..b353c5bd6753d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13841,6 +13841,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-02 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 7660b6cfd000ecd0acc8440cee38e105f06011f0 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a6eb87ab7d8aa..8fabef174bca5 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13847,6 +13847,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index a3f0484ddde84..2e7e4ed1ac63f 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 0c3d2b459a7063febe9e5fc3f5e6bad5112227aa Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 8fabef174bca5..b353c5bd6753d 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13841,6 +13841,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-02 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 220331e26c3d217be10853fdf289c68e16dd77b2 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index a3f0484ddde84..2e7e4ed1ac63f 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 3e51aea6a43a63e0cc142d4ad882d59c2cd0de73 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-02 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 220331e26c3d217be10853fdf289c68e16dd77b2 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index a3f0484ddde84..2e7e4ed1ac63f 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 3e51aea6a43a63e0cc142d4ad882d59c2cd0de73 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-02 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 170f328243143fe91359ed23749f2d6290b4d4ef Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index a3f0484ddde84..2e7e4ed1ac63f 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 164e5c502253f83bbecd1d680b2cb3a35a64b74e Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-07-02 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 170f328243143fe91359ed23749f2d6290b4d4ef Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 7a3b803efd3bd..3fcad652d26d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index a3f0484ddde84..2e7e4ed1ac63f 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 164e5c502253f83bbecd1d680b2cb3a35a64b74e Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-30 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 9644d95a1cbe286c444563ee4dbd672ec076aa9f Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 73b055a76dda7..2e64f4ec4cb2e 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index a3f0484ddde84..2e7e4ed1ac63f 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From d1a4ea5bf4d6a98419aa17a3d35bb8473ab3e38c Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-30 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 9644d95a1cbe286c444563ee4dbd672ec076aa9f Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 73b055a76dda7..2e64f4ec4cb2e 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index a3f0484ddde84..2e7e4ed1ac63f 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
   if (ErrorOrConverter)
 TE.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From d1a4ea5bf4d6a98419aa17a3d35bb8473ab3e38c Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  4 ++--
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-26 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From c6a709f524079dd501f18d545286ea23e527a001 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 73b055a76dda7..2e64f4ec4cb2e 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index df3e4dbcaf4b4..a5d8e5e7da0b1 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
   if (ErrorOrConverter)
 TEC.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From c0a3f853763de0c0ba9fa8bc1ac7d46c1a2b41ff Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-26 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From c6a709f524079dd501f18d545286ea23e527a001 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 73b055a76dda7..2e64f4ec4cb2e 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index df3e4dbcaf4b4..a5d8e5e7da0b1 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
   if (ErrorOrConverter)
 TEC.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From c0a3f853763de0c0ba9fa8bc1ac7d46c1a2b41ff Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-26 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 6a7aca19d01edbdf4431a421eb36b78d16612199 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 73b055a76dda7..2e64f4ec4cb2e 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index df3e4dbcaf4b4..a5d8e5e7da0b1 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
   if (ErrorOrConverter)
 TEC.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 7787a291f47463b6ae390f73c2dceb7e5f092051 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-26 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 6a7aca19d01edbdf4431a421eb36b78d16612199 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 73b055a76dda7..2e64f4ec4cb2e 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index df3e4dbcaf4b4..a5d8e5e7da0b1 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
   if (ErrorOrConverter)
 TEC.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 7787a291f47463b6ae390f73c2dceb7e5f092051 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-19 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 5288c125627734bc2ecc0171cf1f047cc3c4a0d6 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 909bde840d3fa..3424cfc7ca7ac 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index df3e4dbcaf4b4..a5d8e5e7da0b1 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
   if (ErrorOrConverter)
 TEC.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From adc342bd2e73553b6c1362afa482890607bb3dd3 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-19 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 5288c125627734bc2ecc0171cf1f047cc3c4a0d6 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  3 ++-
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 909bde840d3fa..3424cfc7ca7ac 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index abf0cd5e18c2b..b9dc80c3a16a4 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13834,6 +13834,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index ef239cec80ddb..c04c9081c4fec 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index df3e4dbcaf4b4..a5d8e5e7da0b1 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -38,7 +38,8 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
   if (ErrorOrConverter)
 TEC.ToLiteralEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToLiteralEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From adc342bd2e73553b6c1362afa482890607bb3dd3 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp   | 18 +-
 clang/lib/Lex/TextEncoding.cpp |  2 +-
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index b9dc80c3a16a4..fe35175425cbc 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13828,6 +13828,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Converter->convert(Key, ConvertedKey);
+Key = ConvertedKey;
+  }
+
   StringLiteral *&Result = StringLiteralCa

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-17 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From ddafbc75ade7d89768f0026b30e277039d2dbe86 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 909bde840d3fa..3424cfc7ca7ac 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 1e35aba7b2b19..ce7cd90d212bb 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13805,6 +13805,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 0864d6855068a..c6fcd2bda1067 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index 1edd1e7ff1d83..71e10c3ec9cd0 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -35,10 +35,11 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From bf8e3ac9e65814cfa77bcc24d88dd6a5a0b76ee9 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index ce7cd90d212bb..351454e8686c8 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13799,6 +13799,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Conv

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-17 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From ddafbc75ade7d89768f0026b30e277039d2dbe86 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 909bde840d3fa..3424cfc7ca7ac 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 1e35aba7b2b19..ce7cd90d212bb 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13805,6 +13805,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 0864d6855068a..c6fcd2bda1067 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index 1edd1e7ff1d83..71e10c3ec9cd0 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -35,10 +35,11 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From bf8e3ac9e65814cfa77bcc24d88dd6a5a0b76ee9 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index ce7cd90d212bb..351454e8686c8 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13799,6 +13799,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Conv

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-08 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From d3f8b79f2df7c20b8a06eea7dba18f3d5b016f88 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 909bde840d3fa..3424cfc7ca7ac 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index 1edd1e7ff1d83..71e10c3ec9cd0 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -35,10 +35,11 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 326b4058ce4a6737ac0e8260f33b6103737d30ab Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Conv

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-06-08 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From d3f8b79f2df7c20b8a06eea7dba18f3d5b016f88 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncoding.cpp |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 909bde840d3fa..3424cfc7ca7ac 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index 1edd1e7ff1d83..71e10c3ec9cd0 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -35,10 +35,11 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 59c4ad550cd94..34571a25f0e2c 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -72,3 +72,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 326b4058ce4a6737ac0e8260f33b6103737d30ab Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+Conv

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-28 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From b8f28cf08196c4fb0bf4497468c6ecf149b21104 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 41ad751c4b769..2722f94f24153 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 9cafdec6b9655..3c64ceba15c7f 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From f827558eedaaf078f5066f5c401eeeb10f4f3d6d Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrCo

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-28 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From b8f28cf08196c4fb0bf4497468c6ecf149b21104 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 41ad751c4b769..2722f94f24153 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 9cafdec6b9655..3c64ceba15c7f 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From f827558eedaaf078f5066f5c401eeeb10f4f3d6d Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrCo

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-25 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 3a6d2fd3f9d1f3888f4a7a74d1fac66293522814 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 41ad751c4b769..2722f94f24153 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index bc4a6b220412b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From c6d040e0a2fa5dc770a837db2a82c90c848ddad1 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrCo

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-25 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 3a6d2fd3f9d1f3888f4a7a74d1fac66293522814 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 41ad751c4b769..2722f94f24153 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index bc4a6b220412b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From c6d040e0a2fa5dc770a837db2a82c90c848ddad1 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrCo

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-25 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 90283cbad8b47959b9815bcb01fb1f9ef10d39ee Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 41ad751c4b769..2722f94f24153 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index bc4a6b220412b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From dafffd2353cff0e6b43cdceaa9f12030b7903d9b Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrCo

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-25 Thread Corentin Jabot via llvm-branch-commits


@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+

cor3ntin wrote:

Whether we decided to do that or not, we should not do it in this PR :)
Lets try to get the first PR through and then we can build on top of that.

https://github.com/llvm/llvm-project/pull/196569
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-25 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 90283cbad8b47959b9815bcb01fb1f9ef10d39ee Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 41ad751c4b769..2722f94f24153 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index bc4a6b220412b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From dafffd2353cff0e6b43cdceaa9f12030b7903d9b Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrCo

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-25 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 38be1529e101509c2e3cff50e188a5adb894e965 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 41ad751c4b769..2722f94f24153 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 9cafdec6b9655..3c64ceba15c7f 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 162767193faa1144c2118b9bccc67dd6effa3fc1 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrCo

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-25 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 38be1529e101509c2e3cff50e188a5adb894e965 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 41ad751c4b769..2722f94f24153 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a401a7471e6fc..e30c24dd9e0fd 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13804,6 +13804,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 83132c2370ed4..b6f2a599ebb6e 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 9cafdec6b9655..3c64ceba15c7f 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 162767193faa1144c2118b9bccc67dd6effa3fc1 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index e30c24dd9e0fd..a936fdb392241 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13798,6 +13798,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrCo

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-22 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 343a4568d6dcf29d27d3388af55efb0cd48460df Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH 1/2] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index bc4a6b220412b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

>From 83b06f8faedaed38551be7223429e8b3d18f2dab Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 22 May 2026 08:51:37 -0400
Subject: [PATCH 2/2] Convert the key before cache lookup to prevent encoding
 differences

---
 clang/lib/AST/ASTContext.cpp | 18 +-
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 80e073385ce82..0da35a63253f1 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13746,6 +13746,15 @@ QualType 
ASTContext::getStringLiteralArrayType(QualType EltTy,
 
 StringLiteral *
 ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
+  // Apply encoding conversion to the key before cache lookup to ensure
+  // proper deduplication when the same source location is used multiple times
+  SmallString<128> ConvertedKey;
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrCo

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-16 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 343a4568d6dcf29d27d3388af55efb0cd48460df Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index bc4a6b220412b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-15 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 343a4568d6dcf29d27d3388af55efb0cd48460df Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 ++
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  5 +++--
 clang/test/CodeGen/systemz-charset.cpp |  4 
 5 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index bc4a6b220412b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,10 +37,11 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
   ErrorOrConverter = llvm::TextEncodingConverter::create(
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 396b82909fc9b..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -71,3 +71,7 @@ const char16_t *UnicodeUCNString16 = 
u"\u00E2\u00AC\U00DF";
 const char32_t *UnicodeUCNString32 = U"\u00E2\u00AC\U00DF";
 //CHECK: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
 //CHECK=UTF8: [4 x i32] [i32 226, i32 172, i32 223, i32 0]
+
+const char *file = __builtin_FILE();
+//CHECK: {{.*}}\A2\A8\A2\A3\85\94\A9`\83\88\81\99\A2\85\A3K\83\97\97\00"
+//CHECK-UTF8: {{.*}}systemz-charset.cpp\00"

___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-13 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 1b89edc902bdd2fd2328c55473ef7eb01161202b Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 +
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  9 +
 clang/test/CodeGen/systemz-charset.cpp | 28 ++
 5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 427b75a1c0a8b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,14 +37,15 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
-  ErrorOrConverter = llvm::TextEncodingConverter::create(TEC.SystemEncoding,
- TEC.InternalEncoding);
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+  TInfo.getTriple().getDefaultNarrowTextEncoding(), UTF8);
 
   if (ErrorOrConverter)
 TInfo.FormatStrConverter =
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 8ce4e906325dd..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -1,49 +1,77 @@
 // RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -std=c++17 
-fexec-charset IBM-1047 -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -fexec-charset UTF-8 
-o - | FileCheck %s --check-prefix=CHECK-UTF8
 
 const char *RawString = R"(Hello\n)";
 //CHECK: c"\C8\85\93\93\96\E0\95\00"
+//CHECK-UTF8: c"Hello\\n\00"
 
 const char *MultiLineRawString = R"(
 Hello
 There)";
 //CHECK: c"\15\C8\85\93\93\96\15\E3\88\85\99\85\00"
+//CHECK-UTF8: c"\0AHello\0AThere\00"
 
 char UnicodeChar8 = u8'1';
 //CHECK: i8 49
+//CHECK-UTF8: i8 49
 char16_t UnicodeChar16 = u'1';
 //CHECK: i16 49
+//CHECK-UTF8: i16 49
 char32_t UnicodeChar32 = U'1';
 //CHECK: i32 49
+//CHECK-UTF8: i32 49
 
 int FourChar = '1234';
 //CHECK: i32 -235736076
 
 const char *EscapeCharacters8 = u8"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
+//CHECK-UTF8: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
 
 const char16_t *EscapeCharacters16 = u"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, i16 
92,

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-12 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 0943a74d2e522a648f23cd3ff35a10e435d3b12b Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 +
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  9 +
 clang/test/CodeGen/systemz-charset.cpp | 28 ++
 5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 427b75a1c0a8b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,14 +37,15 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
-  ErrorOrConverter = llvm::TextEncodingConverter::create(TEC.SystemEncoding,
- TEC.InternalEncoding);
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+  TInfo.getTriple().getDefaultNarrowTextEncoding(), UTF8);
 
   if (ErrorOrConverter)
 TInfo.FormatStrConverter =
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 8ce4e906325dd..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -1,49 +1,77 @@
 // RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -std=c++17 
-fexec-charset IBM-1047 -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -fexec-charset UTF-8 
-o - | FileCheck %s --check-prefix=CHECK-UTF8
 
 const char *RawString = R"(Hello\n)";
 //CHECK: c"\C8\85\93\93\96\E0\95\00"
+//CHECK-UTF8: c"Hello\\n\00"
 
 const char *MultiLineRawString = R"(
 Hello
 There)";
 //CHECK: c"\15\C8\85\93\93\96\15\E3\88\85\99\85\00"
+//CHECK-UTF8: c"\0AHello\0AThere\00"
 
 char UnicodeChar8 = u8'1';
 //CHECK: i8 49
+//CHECK-UTF8: i8 49
 char16_t UnicodeChar16 = u'1';
 //CHECK: i16 49
+//CHECK-UTF8: i16 49
 char32_t UnicodeChar32 = U'1';
 //CHECK: i32 49
+//CHECK-UTF8: i32 49
 
 int FourChar = '1234';
 //CHECK: i32 -235736076
 
 const char *EscapeCharacters8 = u8"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
+//CHECK-UTF8: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
 
 const char16_t *EscapeCharacters16 = u"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, i16 
92,

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-12 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From 0943a74d2e522a648f23cd3ff35a10e435d3b12b Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 +
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  9 +
 clang/test/CodeGen/systemz-charset.cpp | 28 ++
 5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 427b75a1c0a8b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,14 +37,15 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
-  ErrorOrConverter = llvm::TextEncodingConverter::create(TEC.SystemEncoding,
- TEC.InternalEncoding);
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+  TInfo.getTriple().getDefaultNarrowTextEncoding(), UTF8);
 
   if (ErrorOrConverter)
 TInfo.FormatStrConverter =
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index 8ce4e906325dd..ffab1c50ed3d5 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -1,49 +1,77 @@
 // RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -std=c++17 
-fexec-charset IBM-1047 -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -fexec-charset UTF-8 
-o - | FileCheck %s --check-prefix=CHECK-UTF8
 
 const char *RawString = R"(Hello\n)";
 //CHECK: c"\C8\85\93\93\96\E0\95\00"
+//CHECK-UTF8: c"Hello\\n\00"
 
 const char *MultiLineRawString = R"(
 Hello
 There)";
 //CHECK: c"\15\C8\85\93\93\96\15\E3\88\85\99\85\00"
+//CHECK-UTF8: c"\0AHello\0AThere\00"
 
 char UnicodeChar8 = u8'1';
 //CHECK: i8 49
+//CHECK-UTF8: i8 49
 char16_t UnicodeChar16 = u'1';
 //CHECK: i16 49
+//CHECK-UTF8: i16 49
 char32_t UnicodeChar32 = U'1';
 //CHECK: i32 49
+//CHECK-UTF8: i32 49
 
 int FourChar = '1234';
 //CHECK: i32 -235736076
 
 const char *EscapeCharacters8 = u8"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
+//CHECK-UTF8: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
 
 const char16_t *EscapeCharacters16 = u"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, i16 
92,

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-11 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From b9613dc0da822e2fe2c507273ed0c428f2ca778f Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 +
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  9 +
 clang/test/CodeGen/systemz-charset.cpp | 28 ++
 5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 427b75a1c0a8b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,14 +37,15 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
-  ErrorOrConverter = llvm::TextEncodingConverter::create(TEC.SystemEncoding,
- TEC.InternalEncoding);
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+  TInfo.getTriple().getDefaultNarrowTextEncoding(), UTF8);
 
   if (ErrorOrConverter)
 TInfo.FormatStrConverter =
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index f7becd5b39492..f8219ca00d20a 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -1,46 +1,74 @@
 // RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -std=c++17 
-fexec-charset IBM-1047 -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -fexec-charset UTF-8 
-o - | FileCheck %s --check-prefix=CHECK-UTF8
 
 const char *RawString = R"(Hello\n)";
 //CHECK: c"\C8\85\93\93\96\E0\95\00"
+//CHECK-UTF8: c"Hello\\n\00"
 
 const char *MultiLineRawString = R"(
 Hello
 There)";
 //CHECK: c"\15\C8\85\93\93\96\15\E3\88\85\99\85\00"
+//CHECK-UTF8: c"\0AHello\0AThere\00"
 
 char UnicodeChar8 = u8'1';
 //CHECK: i8 49
+//CHECK-UTF8: i8 49
 char16_t UnicodeChar16 = u'1';
 //CHECK: i16 49
+//CHECK-UTF8: i16 49
 char32_t UnicodeChar32 = U'1';
 //CHECK: i32 49
+//CHECK-UTF8: i32 49
 
 const char *EscapeCharacters8 = u8"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
+//CHECK-UTF8: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
 
 const char16_t *EscapeCharacters16 = u"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, i16 
92, i16 39, i16 34, i16 63, i16 0]
+//CHECK-UTF8: [12 

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-11 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From b9613dc0da822e2fe2c507273ed0c428f2ca778f Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 +
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  9 +
 clang/test/CodeGen/systemz-charset.cpp | 28 ++
 5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 427b75a1c0a8b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,14 +37,15 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
-  ErrorOrConverter = llvm::TextEncodingConverter::create(TEC.SystemEncoding,
- TEC.InternalEncoding);
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+  TInfo.getTriple().getDefaultNarrowTextEncoding(), UTF8);
 
   if (ErrorOrConverter)
 TInfo.FormatStrConverter =
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index f7becd5b39492..f8219ca00d20a 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -1,46 +1,74 @@
 // RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -std=c++17 
-fexec-charset IBM-1047 -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -fexec-charset UTF-8 
-o - | FileCheck %s --check-prefix=CHECK-UTF8
 
 const char *RawString = R"(Hello\n)";
 //CHECK: c"\C8\85\93\93\96\E0\95\00"
+//CHECK-UTF8: c"Hello\\n\00"
 
 const char *MultiLineRawString = R"(
 Hello
 There)";
 //CHECK: c"\15\C8\85\93\93\96\15\E3\88\85\99\85\00"
+//CHECK-UTF8: c"\0AHello\0AThere\00"
 
 char UnicodeChar8 = u8'1';
 //CHECK: i8 49
+//CHECK-UTF8: i8 49
 char16_t UnicodeChar16 = u'1';
 //CHECK: i16 49
+//CHECK-UTF8: i16 49
 char32_t UnicodeChar32 = U'1';
 //CHECK: i32 49
+//CHECK-UTF8: i32 49
 
 const char *EscapeCharacters8 = u8"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
+//CHECK-UTF8: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
 
 const char16_t *EscapeCharacters16 = u"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, i16 
92, i16 39, i16 34, i16 63, i16 0]
+//CHECK-UTF8: [12 

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-09 Thread via llvm-branch-commits

llvmorg-github-actions[bot] wrote:




@llvm/pr-subscribers-clang

Author: Abhina Sree (abhina-sree)


Changes



---
Full diff: https://github.com/llvm/llvm-project/pull/196569.diff


5 Files Affected:

- (modified) clang/include/clang/Basic/TargetInfo.h (+2) 
- (modified) clang/lib/AST/ASTContext.cpp (+10) 
- (modified) clang/lib/Basic/TargetInfo.cpp (+3) 
- (modified) clang/lib/Lex/TextEncodingConfig.cpp (+5-4) 
- (modified) clang/test/CodeGen/systemz-charset.cpp (+28) 


``diff
diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 427b75a1c0a8b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,14 +37,15 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
-  ErrorOrConverter = llvm::TextEncodingConverter::create(TEC.SystemEncoding,
- TEC.InternalEncoding);
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+  TInfo.getTriple().getDefaultNarrowTextEncoding(), UTF8);
 
   if (ErrorOrConverter)
 TInfo.FormatStrConverter =
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index f7becd5b39492..f8219ca00d20a 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -1,46 +1,74 @@
 // RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -std=c++17 
-fexec-charset IBM-1047 -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -fexec-charset UTF-8 
-o - | FileCheck %s --check-prefix=CHECK-UTF8
 
 const char *RawString = R"(Hello\n)";
 //CHECK: c"\C8\85\93\93\96\E0\95\00"
+//CHECK-UTF8: c"Hello\\n\00"
 
 const char *MultiLineRawString = R"(
 Hello
 There)";
 //CHECK: c"\15\C8\85\93\93\96\15\E3\88\85\99\85\00"
+//CHECK-UTF8: c"\0AHello\0AThere\00"
 
 char UnicodeChar8 = u8'1';
 //CHECK: i8 49
+//CHECK-UTF8: i8 49
 char16_t UnicodeChar16 = u'1';
 //CHECK: i16 49
+//CHECK-UTF8: i16 49
 char32_t UnicodeChar32 = U'1';
 //CHECK: i32 49
+//CHECK-UTF8: i32 49
 
 const char *EscapeCharacters8 = u8"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
+//CHECK-UTF8: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
 
 const char16_t *EscapeCharacters16 = u"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, i16 
92, i16 39, i16 34, i16 63, i16 0]
+//CHECK-UTF8: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, 
i16 92, i16 39, i16 34, i16 63, i16 0]
 
 const char32_t *EscapeCharacters32 = U"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-09 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From d1b40cd87815fcd185cefc03e3e41331467d0964 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 +
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  9 +
 clang/test/CodeGen/systemz-charset.cpp | 28 ++
 5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 427b75a1c0a8b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,14 +37,15 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
-  ErrorOrConverter = llvm::TextEncodingConverter::create(TEC.SystemEncoding,
- TEC.InternalEncoding);
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+  TInfo.getTriple().getDefaultNarrowTextEncoding(), UTF8);
 
   if (ErrorOrConverter)
 TInfo.FormatStrConverter =
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index f7becd5b39492..f8219ca00d20a 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -1,46 +1,74 @@
 // RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -std=c++17 
-fexec-charset IBM-1047 -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -fexec-charset UTF-8 
-o - | FileCheck %s --check-prefix=CHECK-UTF8
 
 const char *RawString = R"(Hello\n)";
 //CHECK: c"\C8\85\93\93\96\E0\95\00"
+//CHECK-UTF8: c"Hello\\n\00"
 
 const char *MultiLineRawString = R"(
 Hello
 There)";
 //CHECK: c"\15\C8\85\93\93\96\15\E3\88\85\99\85\00"
+//CHECK-UTF8: c"\0AHello\0AThere\00"
 
 char UnicodeChar8 = u8'1';
 //CHECK: i8 49
+//CHECK-UTF8: i8 49
 char16_t UnicodeChar16 = u'1';
 //CHECK: i16 49
+//CHECK-UTF8: i16 49
 char32_t UnicodeChar32 = U'1';
 //CHECK: i32 49
+//CHECK-UTF8: i32 49
 
 const char *EscapeCharacters8 = u8"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
+//CHECK-UTF8: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
 
 const char16_t *EscapeCharacters16 = u"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, i16 
92, i16 39, i16 34, i16 63, i16 0]
+//CHECK-UTF8: [12 

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-09 Thread via llvm-branch-commits

github-actions[bot] wrote:


# :window: Windows x64 Test Results

* 53879 tests passed
* 1200 tests skipped
* 1 test failed

## Failed Tests
(click on a test name to see its output)

### Clang

Clang.SemaCXX/source_location_err.cpp

```
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 1
c:\_work\llvm-project\llvm-project\build\bin\clang.exe -cc1 -internal-isystem 
C:\_work\llvm-project\llvm-project\build\lib\clang\23\include -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=1 
C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp
# executed command: 'c:\_work\llvm-project\llvm-project\build\bin\clang.exe' 
-cc1 -internal-isystem 
'C:\_work\llvm-project\llvm-project\build\lib\clang\23\include' -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=1 
'C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp'
# note: command had no output on stdout or stderr
# RUN: at line 2
c:\_work\llvm-project\llvm-project\build\bin\clang.exe -cc1 -internal-isystem 
C:\_work\llvm-project\llvm-project\build\lib\clang\23\include -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=2 
C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp
# executed command: 'c:\_work\llvm-project\llvm-project\build\bin\clang.exe' 
-cc1 -internal-isystem 
'C:\_work\llvm-project\llvm-project\build\lib\clang\23\include' -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=2 
'C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp'
# note: command had no output on stdout or stderr
# RUN: at line 3
c:\_work\llvm-project\llvm-project\build\bin\clang.exe -cc1 -internal-isystem 
C:\_work\llvm-project\llvm-project\build\lib\clang\23\include -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=3 
C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp
# executed command: 'c:\_work\llvm-project\llvm-project\build\bin\clang.exe' 
-cc1 -internal-isystem 
'C:\_work\llvm-project\llvm-project\build\lib\clang\23\include' -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=3 
'C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp'
# note: command had no output on stdout or stderr
# RUN: at line 4
c:\_work\llvm-project\llvm-project\build\bin\clang.exe -cc1 -internal-isystem 
C:\_work\llvm-project\llvm-project\build\lib\clang\23\include -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=4 
C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp
# executed command: 'c:\_work\llvm-project\llvm-project\build\bin\clang.exe' 
-cc1 -internal-isystem 
'C:\_work\llvm-project\llvm-project\build\lib\clang\23\include' -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=4 
'C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp'
# note: command had no output on stdout or stderr
# RUN: at line 5
c:\_work\llvm-project\llvm-project\build\bin\clang.exe -cc1 -internal-isystem 
C:\_work\llvm-project\llvm-project\build\lib\clang\23\include -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=5 
C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp
# executed command: 'c:\_work\llvm-project\llvm-project\build\bin\clang.exe' 
-cc1 -internal-isystem 
'C:\_work\llvm-project\llvm-project\build\lib\clang\23\include' -nostdsysteminc 
-std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=5 
'C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp'
# .---command stderr
# | error: 'expected-error' diagnostics seen but not expected: 
# |   File 
C:\_work\llvm-project\llvm-project\clang\test\SemaCXX\source_location_err.cpp 
Line 386: static assertion failed due to requirement 'sl1 == sl2'
# | 1 error generated.
# `-
# error: command failed with exit status: 1

--

```


If these failures are unrelated to your changes (for example tests are broken 
or flaky at HEAD), please open an issue at 
https://github.com/llvm/llvm-project/issues and add the `infrastructure` label.

https://github.com/llvm/llvm-project/pull/196569
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-09 Thread Abhina Sree via llvm-branch-commits

abhina-sree wrote:

> [!WARNING]
> This pull request is not mergeable via GitHub because a downstack PR is 
> open. Once all requirements are satisfied, merge this PR as a stack  href="https://app.graphite.com/github/pr/llvm/llvm-project/196569?utm_source=stack-comment-downstack-mergeability-warning";
>  >on Graphite.
> https://graphite.dev/docs/merge-pull-requests";>Learn more

* **#195890** https://app.graphite.com/github/pr/llvm/llvm-project/195890?utm_source=stack-comment-icon";
 target="_blank">https://static.graphite.dev/graphite-32x32-black.png"; alt="Graphite" 
width="10px" height="10px"/>
* **#196569** https://app.graphite.com/github/pr/llvm/llvm-project/196569?utm_source=stack-comment-icon";
 target="_blank">https://static.graphite.dev/graphite-32x32-black.png"; alt="Graphite" 
width="10px" height="10px"/> 👈 https://app.graphite.com/github/pr/llvm/llvm-project/196569?utm_source=stack-comment-view-in-graphite";
 target="_blank">(View in Graphite)
* **#196568** https://app.graphite.com/github/pr/llvm/llvm-project/196568?utm_source=stack-comment-icon";
 target="_blank">https://static.graphite.dev/graphite-32x32-black.png"; alt="Graphite" 
width="10px" height="10px"/>
* **#169803** https://app.graphite.com/github/pr/llvm/llvm-project/169803?utm_source=stack-comment-icon";
 target="_blank">https://static.graphite.dev/graphite-32x32-black.png"; alt="Graphite" 
width="10px" height="10px"/>
* **#138895** https://app.graphite.com/github/pr/llvm/llvm-project/138895?utm_source=stack-comment-icon";
 target="_blank">https://static.graphite.dev/graphite-32x32-black.png"; alt="Graphite" 
width="10px" height="10px"/>
* `main`




This stack of pull requests is managed by https://graphite.dev?utm-source=stack-comment";>Graphite. Learn 
more about https://stacking.dev/?utm_source=stack-comment";>stacking.


https://github.com/llvm/llvm-project/pull/196569
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-09 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree updated 
https://github.com/llvm/llvm-project/pull/196569

>From d1b40cd87815fcd185cefc03e3e41331467d0964 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 +
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  9 +
 clang/test/CodeGen/systemz-charset.cpp | 28 ++
 5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 427b75a1c0a8b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,14 +37,15 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
-  ErrorOrConverter = llvm::TextEncodingConverter::create(TEC.SystemEncoding,
- TEC.InternalEncoding);
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+  TInfo.getTriple().getDefaultNarrowTextEncoding(), UTF8);
 
   if (ErrorOrConverter)
 TInfo.FormatStrConverter =
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index f7becd5b39492..f8219ca00d20a 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -1,46 +1,74 @@
 // RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -std=c++17 
-fexec-charset IBM-1047 -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -fexec-charset UTF-8 
-o - | FileCheck %s --check-prefix=CHECK-UTF8
 
 const char *RawString = R"(Hello\n)";
 //CHECK: c"\C8\85\93\93\96\E0\95\00"
+//CHECK-UTF8: c"Hello\\n\00"
 
 const char *MultiLineRawString = R"(
 Hello
 There)";
 //CHECK: c"\15\C8\85\93\93\96\15\E3\88\85\99\85\00"
+//CHECK-UTF8: c"\0AHello\0AThere\00"
 
 char UnicodeChar8 = u8'1';
 //CHECK: i8 49
+//CHECK-UTF8: i8 49
 char16_t UnicodeChar16 = u'1';
 //CHECK: i16 49
+//CHECK-UTF8: i16 49
 char32_t UnicodeChar32 = U'1';
 //CHECK: i32 49
+//CHECK-UTF8: i32 49
 
 const char *EscapeCharacters8 = u8"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
+//CHECK-UTF8: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
 
 const char16_t *EscapeCharacters16 = u"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, i16 
92, i16 39, i16 34, i16 63, i16 0]
+//CHECK-UTF8: [12 

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-09 Thread via llvm-branch-commits

github-actions[bot] wrote:


# :penguin: Linux x64 Test Results

* 87906 tests passed
* 1551 tests skipped
* 1 test failed

## Failed Tests
(click on a test name to see its output)

### Clang

Clang.SemaCXX/source_location_err.cpp

```
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 1
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=1 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# executed command: 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=1 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# note: command had no output on stdout or stderr
# RUN: at line 2
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=2 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# executed command: 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=2 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# note: command had no output on stdout or stderr
# RUN: at line 3
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=3 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# executed command: 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=3 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# note: command had no output on stdout or stderr
# RUN: at line 4
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=4 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# executed command: 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=4 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# note: command had no output on stdout or stderr
# RUN: at line 5
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=5 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# executed command: 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/bin/clang -cc1 
-internal-isystem 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/lib/clang/23/include
 -nostdsysteminc -std=c++1z -fcxx-exceptions -fexceptions -verify -DTEST=5 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
# .---command stderr
# | error: 'expected-error' diagnostics seen but not expected: 
# |   File 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang/test/SemaCXX/source_location_err.cpp
 Line 386: static assertion failed due to requirement 'sl1 == sl2'
# | 1 error generated.
# `-
# error: command failed with exit status: 1

--

```


If these failures are unrelated to your changes (for example tests are broken 
or flaky at HEAD), please open an issue at 
https://github.com/llvm/llvm-project/issues and add the `infrastructure` label.

https://github.com/llvm/llvm-project/pull/196569
___
llvm-branch-commits mailing list
[email protected]

[llvm-branch-commits] [clang] Convert to exec-charset inside getPredefinedStringLiteralFromCache (PR #196569)

2026-05-09 Thread Abhina Sree via llvm-branch-commits

https://github.com/abhina-sree created 
https://github.com/llvm/llvm-project/pull/196569

None

>From 5d6451c4002332c296c79cff8ee42f0ec2287f27 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan 
Date: Fri, 8 May 2026 12:20:45 -0400
Subject: [PATCH] convert to exec-charset inside
 getPredefinedStringLiteralFromCache, test __builtin_FILE()

---
 clang/include/clang/Basic/TargetInfo.h |  2 ++
 clang/lib/AST/ASTContext.cpp   | 10 +
 clang/lib/Basic/TargetInfo.cpp |  3 +++
 clang/lib/Lex/TextEncodingConfig.cpp   |  9 +
 clang/test/CodeGen/systemz-charset.cpp | 28 ++
 5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index ec7d4fcd4d8e3..6c0e65a85ee13 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -326,6 +326,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   llvm::TextEncodingConverter *FormatStrConverter;
 
+  llvm::TextEncodingConverter *ExecStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
 assert(TargetOpts && "Missing target options");
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index a0894318dbd53..80e073385ce82 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -13752,6 +13752,16 @@ 
ASTContext::getPredefinedStringLiteralFromCache(StringRef Key) const {
 *this, Key, StringLiteralKind::Ordinary,
 /*Pascal*/ false, getStringLiteralArrayType(CharTy, Key.size()),
 SourceLocation());
+
+  llvm::TextEncodingConverter *Converter = getTargetInfo().ExecStrConverter;
+  if (Converter) {
+SmallString<128> Converted;
+Converter->convert(Result->getString(), Converted);
+Result = StringLiteral::Create(
+*this, Converted, StringLiteralKind::Ordinary, /*Pascal*/ false,
+getStringLiteralArrayType(CharTy, Converted.size()), SourceLocation());
+  }
+
   return Result;
 }
 
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 43efca42886cc..0c553033ad069 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -197,6 +197,9 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   FormatStrConverter = new llvm::TextEncodingConverter(
   std::move(*llvm::TextEncodingConverter::createNoopConverter()));
+
+  ExecStrConverter = new llvm::TextEncodingConverter(
+  std::move(*llvm::TextEncodingConverter::createNoopConverter()));
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncodingConfig.cpp 
b/clang/lib/Lex/TextEncodingConfig.cpp
index 427b75a1c0a8b..6df88e258ffde 100644
--- a/clang/lib/Lex/TextEncodingConfig.cpp
+++ b/clang/lib/Lex/TextEncodingConfig.cpp
@@ -37,14 +37,15 @@ 
TextEncodingConfig::setConvertersFromOptions(TextEncodingConfig &TEC,
 return std::error_code();
   ErrorOr ErrorOrConverter =
   llvm::TextEncodingConverter::create(UTF8, TEC.ExecEncoding);
-  if (ErrorOrConverter)
+  if (ErrorOrConverter) {
 TEC.ToExecEncodingConverter =
 new TextEncodingConverter(std::move(*ErrorOrConverter));
-  else
+TInfo.ExecStrConverter = TEC.ToExecEncodingConverter;
+  } else
 return ErrorOrConverter.getError();
 
-  ErrorOrConverter = llvm::TextEncodingConverter::create(TEC.SystemEncoding,
- TEC.InternalEncoding);
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+  TInfo.getTriple().getDefaultNarrowTextEncoding(), UTF8);
 
   if (ErrorOrConverter)
 TInfo.FormatStrConverter =
diff --git a/clang/test/CodeGen/systemz-charset.cpp 
b/clang/test/CodeGen/systemz-charset.cpp
index f7becd5b39492..f8219ca00d20a 100644
--- a/clang/test/CodeGen/systemz-charset.cpp
+++ b/clang/test/CodeGen/systemz-charset.cpp
@@ -1,46 +1,74 @@
 // RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -std=c++17 
-fexec-charset IBM-1047 -o - | FileCheck %s
+// RUN: %clang_cc1 %s -emit-llvm -triple s390x-none-zos -fexec-charset UTF-8 
-o - | FileCheck %s --check-prefix=CHECK-UTF8
 
 const char *RawString = R"(Hello\n)";
 //CHECK: c"\C8\85\93\93\96\E0\95\00"
+//CHECK-UTF8: c"Hello\\n\00"
 
 const char *MultiLineRawString = R"(
 Hello
 There)";
 //CHECK: c"\15\C8\85\93\93\96\15\E3\88\85\99\85\00"
+//CHECK-UTF8: c"\0AHello\0AThere\00"
 
 char UnicodeChar8 = u8'1';
 //CHECK: i8 49
+//CHECK-UTF8: i8 49
 char16_t UnicodeChar16 = u'1';
 //CHECK: i16 49
+//CHECK-UTF8: i16 49
 char32_t UnicodeChar32 = U'1';
 //CHECK: i32 49
+//CHECK-UTF8: i32 49
 
 const char *EscapeCharacters8 = u8"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
+//CHECK-UTF8: c"\07\08\0C\0A\0D\09\0B\\'\22?\00"
 
 const char16_t *EscapeCharacters16 = u"\a\b\f\n\r\t\v\\\'\"\?";
 //CHECK: [12 x i16] [i16 7, i16 8, i16 12, i16 10, i16 13, i16 9, i16 11, i16 
92, i16 39, i16 34, i16 63, i16 0]
+//CHECK-UTF8