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

>From be3834f0d9139331085cd80fabed28aaf7f8c1be Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan <[email protected]>
Date: Fri, 8 May 2026 12:17:22 -0400
Subject: [PATCH 1/6] add ParserConversionAction, do not translate unevaluated
 strings

---
 clang/include/clang/Parse/Parser.h          | 1 +
 clang/include/clang/Sema/Sema.h             | 4 +++-
 clang/lib/Parse/ParseDecl.cpp               | 9 +++++++++
 clang/lib/Parse/ParseExpr.cpp               | 6 +++---
 clang/lib/Parse/Parser.cpp                  | 4 ++++
 clang/lib/Sema/SemaExpr.cpp                 | 8 ++++----
 clang/test/CodeGen/systemz-charset-diag.cpp | 8 ++++++++
 clang/test/CodeGen/systemz-charset.c        | 5 +++++
 8 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/clang/include/clang/Parse/Parser.h 
b/clang/include/clang/Parse/Parser.h
index 163aa483a84e3..824c97d048df1 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/include/clang/Parse/Parser.h
@@ -5716,6 +5716,7 @@ class Parser : public CodeCompletionHandler {
     bool Finished;
   };
   ObjCImplParsingDataRAII *CurParsedObjCImpl;
+  ConversionAction ParserConversionAction;
 
   /// StashAwayMethodOrFunctionBodyTokens -  Consume the tokens and store them
   /// for later parsing.
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index b1d2488d2163b..8ff9cba3ead47 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -54,6 +54,7 @@
 #include "clang/Basic/StackExhaustionHandler.h"
 #include "clang/Basic/TemplateKinds.h"
 #include "clang/Basic/TokenKinds.h"
+#include "clang/Lex/TextEncoding.h"
 #include "clang/Sema/AnalysisBasedWarnings.h"
 #include "clang/Sema/Attr.h"
 #include "clang/Sema/CleanupInfo.h"
@@ -7397,7 +7398,8 @@ class Sema final : public SemaBase {
   /// from multiple tokens.  However, the common case is that StringToks points
   /// to one string.
   ExprResult ActOnStringLiteral(ArrayRef<Token> StringToks,
-                                Scope *UDLScope = nullptr);
+                                Scope *UDLScope = nullptr,
+                                ConversionAction Action = 
CA_ToLiteralEncoding);
 
   ExprResult ActOnUnevaluatedStringLiteral(ArrayRef<Token> StringToks);
 
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 2bbc76fc7c4df..8475143c69b36 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -565,6 +565,9 @@ unsigned Parser::ParseAttributeArgsCommon(
               nullptr,
               Sema::ExpressionEvaluationContextRecord::EK_AttrArgument);
 
+          SaveAndRestore<ConversionAction> SavedTranslationState(
+              ParserConversionAction, CA_NoConversion);
+
           ExprResult ArgExpr = ParseAssignmentExpression();
           if (ArgExpr.isInvalid()) {
             SkipUntil(tok::r_paren, StopAtSemi);
@@ -645,6 +648,9 @@ void Parser::ParseGNUAttributeArgs(
   ParsedAttr::Kind AttrKind =
       ParsedAttr::getParsedKind(AttrName, ScopeName, Form.getSyntax());
 
+  SaveAndRestore<ConversionAction> 
SavedTranslationState(ParserConversionAction,
+                                                         CA_NoConversion);
+
   if (AttrKind == ParsedAttr::AT_Availability) {
     ParseAvailabilityAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc, 
ScopeName,
                                ScopeLoc, Form);
@@ -724,6 +730,9 @@ unsigned Parser::ParseClangAttributeArgs(
   ParsedAttr::Kind AttrKind =
       ParsedAttr::getParsedKind(AttrName, ScopeName, Form.getSyntax());
 
+  SaveAndRestore<ConversionAction> 
SavedTranslationState(ParserConversionAction,
+                                                         CA_NoConversion);
+
   switch (AttrKind) {
   default:
     return ParseAttributeArgsCommon(AttrName, AttrNameLoc, Attrs, EndLoc,
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp
index 87cd7a01451cf..06482f6b65426 100644
--- a/clang/lib/Parse/ParseExpr.cpp
+++ b/clang/lib/Parse/ParseExpr.cpp
@@ -3041,9 +3041,9 @@ ExprResult Parser::ParseStringLiteralExpression(bool 
AllowUserDefinedLiteral,
   }
 
   // Pass the set of string tokens, ready for concatenation, to the actions.
-  return Actions.ActOnStringLiteral(StringToks,
-                                    AllowUserDefinedLiteral ? getCurScope()
-                                                            : nullptr);
+  return Actions.ActOnStringLiteral(
+      StringToks, AllowUserDefinedLiteral ? getCurScope() : nullptr,
+      ParserConversionAction);
 }
 
 ExprResult Parser::ParseGenericSelectionExpression() {
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index d83b75072f844..72c6808d51716 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -70,6 +70,8 @@ Parser::Parser(Preprocessor &pp, Sema &actions, bool 
skipFunctionBodies)
   NumCachedScopes = 0;
   CurParsedObjCImpl = nullptr;
 
+  ParserConversionAction = CA_ToLiteralEncoding;
+
   // Add #pragma handlers. These are removed and destroyed in the
   // destructor.
   initializePragmaHandlers();
@@ -1552,6 +1554,8 @@ void Parser::ParseKNRParamDeclarations(Declarator &D) {
 }
 
 ExprResult Parser::ParseAsmStringLiteral(bool ForAsmLabel) {
+  SaveAndRestore<ConversionAction> 
SavedTranslationState(ParserConversionAction,
+                                                         CA_NoConversion);
 
   ExprResult AsmString;
   if (isTokenStringLiteral()) {
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 5f4af9debe91a..283fdbc1a01a2 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -2259,8 +2259,8 @@ Sema::ExpandFunctionLocalPredefinedMacros(ArrayRef<Token> 
Toks) {
   return ExpandedToks;
 }
 
-ExprResult
-Sema::ActOnStringLiteral(ArrayRef<Token> StringToks, Scope *UDLScope) {
+ExprResult Sema::ActOnStringLiteral(ArrayRef<Token> StringToks, Scope 
*UDLScope,
+                                    ConversionAction Action) {
   assert(!StringToks.empty() && "Must have at least one string!");
 
   // StringToks needs backing storage as it doesn't hold array elements itself
@@ -2268,8 +2268,8 @@ Sema::ActOnStringLiteral(ArrayRef<Token> StringToks, 
Scope *UDLScope) {
   if (getLangOpts().MicrosoftExt)
     StringToks = ExpandedToks = 
ExpandFunctionLocalPredefinedMacros(StringToks);
 
-  StringLiteralParser Literal(
-      StringToks, PP, StringLiteralEvalMethod::Evaluated, 
CA_ToLiteralEncoding);
+  StringLiteralParser Literal(StringToks, PP,
+                              StringLiteralEvalMethod::Evaluated, Action);
   if (Literal.hadError)
     return ExprError();
 
diff --git a/clang/test/CodeGen/systemz-charset-diag.cpp 
b/clang/test/CodeGen/systemz-charset-diag.cpp
index 4ed94810150a3..ad08e1f391214 100644
--- a/clang/test/CodeGen/systemz-charset-diag.cpp
+++ b/clang/test/CodeGen/systemz-charset-diag.cpp
@@ -1,3 +1,11 @@
 // RUN: %clang_cc1 -triple s390x-none-zos -fexec-charset IBM-1047 %s 
-std=c++17 -emit-llvm -o - -verify
 
 const char* Computer = "🖥️"; // expected-error-re {{conversion to literal 
encoding failed: {{.*}}}}
+
+static_assert(false, "Error string"); // expected-error {{static assertion 
failed: Error string}}
+
+[[deprecated("message")]] void test_deprecated() {return;} // expected-note 
{{'test_deprecated' has been explicitly marked deprecated here}}
+
+int main() {
+  test_deprecated(); // expected-warning {{'test_deprecated' is deprecated: 
message}}
+}
diff --git a/clang/test/CodeGen/systemz-charset.c 
b/clang/test/CodeGen/systemz-charset.c
index 766b6a83f00ff..e0d1736bf853f 100644
--- a/clang/test/CodeGen/systemz-charset.c
+++ b/clang/test/CodeGen/systemz-charset.c
@@ -66,3 +66,8 @@ const char* hello_macro = HELLO;
 const char* preprocessor_concatenation = HELLO_WORLD;
 //CHECK: c"\C8\85\93\93\96@\E6\96\99\93\84Z\00"
 //CHECK-UTF8: c"Hello World!\00"
+
+void asm_labeled_fn(void) __asm__("asm_sym");
+void asm_labeled_fn(void) {}
+//CHECK: define{{.*}} void @asm_sym(
+//CHECK-UTF8: define{{.*}} void @asm_sym(

>From 988644ae61e7007714ba60e9a5a52b8e5c956748 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan <[email protected]>
Date: Fri, 3 Jul 2026 14:52:22 -0400
Subject: [PATCH 2/6] remove unnecessary changes

---
 clang/lib/Parse/ParseDecl.cpp | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 8475143c69b36..2bbc76fc7c4df 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -565,9 +565,6 @@ unsigned Parser::ParseAttributeArgsCommon(
               nullptr,
               Sema::ExpressionEvaluationContextRecord::EK_AttrArgument);
 
-          SaveAndRestore<ConversionAction> SavedTranslationState(
-              ParserConversionAction, CA_NoConversion);
-
           ExprResult ArgExpr = ParseAssignmentExpression();
           if (ArgExpr.isInvalid()) {
             SkipUntil(tok::r_paren, StopAtSemi);
@@ -648,9 +645,6 @@ void Parser::ParseGNUAttributeArgs(
   ParsedAttr::Kind AttrKind =
       ParsedAttr::getParsedKind(AttrName, ScopeName, Form.getSyntax());
 
-  SaveAndRestore<ConversionAction> 
SavedTranslationState(ParserConversionAction,
-                                                         CA_NoConversion);
-
   if (AttrKind == ParsedAttr::AT_Availability) {
     ParseAvailabilityAttribute(*AttrName, AttrNameLoc, Attrs, EndLoc, 
ScopeName,
                                ScopeLoc, Form);
@@ -730,9 +724,6 @@ unsigned Parser::ParseClangAttributeArgs(
   ParsedAttr::Kind AttrKind =
       ParsedAttr::getParsedKind(AttrName, ScopeName, Form.getSyntax());
 
-  SaveAndRestore<ConversionAction> 
SavedTranslationState(ParserConversionAction,
-                                                         CA_NoConversion);
-
   switch (AttrKind) {
   default:
     return ParseAttributeArgsCommon(AttrName, AttrNameLoc, Attrs, EndLoc,

>From 7e15e19ac1897c32a06afe90370ca9c220a644fd Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan <[email protected]>
Date: Thu, 9 Jul 2026 13:25:39 -0400
Subject: [PATCH 3/6] remove ParserConversionAction, add paramter to
 ParseStringLiteralExpression instead, add conversion to SystemCharset then
 back to UTF8 to handle escape sequences in system encoding

---
 clang/include/clang/Basic/TargetInfo.h  |  3 ++
 clang/include/clang/Lex/TextEncoding.h  | 11 ++++++--
 clang/include/clang/Parse/Parser.h      |  6 ++--
 clang/lib/Basic/TargetInfo.cpp          |  2 ++
 clang/lib/Frontend/CompilerInstance.cpp |  4 +--
 clang/lib/Lex/TextEncoding.cpp          | 37 +++++++++++++++++++++----
 clang/lib/Parse/ParseExpr.cpp           |  6 ++--
 clang/lib/Parse/Parser.cpp              |  8 ++----
 clang/lib/Sema/SemaStmtAsm.cpp          |  8 ++++++
 clang/test/CodeGen/systemz-charset.c    |  6 ++--
 10 files changed, 67 insertions(+), 24 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index 6311b6b567a5e..dba50e03cc6d6 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -38,6 +38,7 @@
 #include "llvm/IR/DerivedTypes.h"
 #include "llvm/Support/DataTypes.h"
 #include "llvm/Support/Error.h"
+#include "llvm/Support/TextEncoding.h"
 #include "llvm/Support/VersionTuple.h"
 #include "llvm/TargetParser/Triple.h"
 #include <cassert>
@@ -329,6 +330,8 @@ class TargetInfo : public TransferrableTargetInfo,
 
   virtual ~TargetInfo();
 
+  std::unique_ptr<llvm::TextEncodingConverter> TargetStrConverter;
+
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
     assert(TargetOpts && "Missing target options");
diff --git a/clang/include/clang/Lex/TextEncoding.h 
b/clang/include/clang/Lex/TextEncoding.h
index 55663cdc072da..02cb16cef9f1b 100644
--- a/clang/include/clang/Lex/TextEncoding.h
+++ b/clang/include/clang/Lex/TextEncoding.h
@@ -10,6 +10,7 @@
 #define LLVM_CLANG_LEX_TEXTENCODING_H
 
 #include "clang/Basic/LangOptions.h"
+#include "clang/Basic/TargetInfo.h"
 #include "llvm/ADT/StringRef.h"
 
 namespace llvm {
@@ -17,16 +18,22 @@ class TextEncodingConverter;
 } // namespace llvm
 
 namespace clang {
-enum ConversionAction { CA_NoConversion, CA_ToLiteralEncoding };
+enum ConversionAction {
+  CA_NoConversion,
+  CA_ToSystemEncoding,
+  CA_ToLiteralEncoding
+};
 
 class TextEncoding {
   llvm::StringRef LiteralEncoding;
   std::unique_ptr<llvm::TextEncodingConverter> ToLiteralEncodingConverter;
+  std::unique_ptr<llvm::TextEncodingConverter> ToSystemEncodingConverter;
 
 public:
   llvm::TextEncodingConverter *getConverter(ConversionAction Action) const;
   static std::error_code
-  setConvertersFromOptions(TextEncoding &TE, const clang::LangOptions &Opts);
+  setConvertersFromOptions(TextEncoding &TE, const clang::LangOptions &Opts,
+                           clang::TargetInfo &TInfo);
 
   llvm::StringRef getLiteralEncoding() { return LiteralEncoding; }
 };
diff --git a/clang/include/clang/Parse/Parser.h 
b/clang/include/clang/Parse/Parser.h
index 824c97d048df1..92c700114420c 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/include/clang/Parse/Parser.h
@@ -3867,8 +3867,9 @@ class Parser : public CodeCompletionHandler {
   /// associated with the class's definition.
   void PopParsingClass(Sema::ParsingClassState);
 
-  ExprResult ParseStringLiteralExpression(bool AllowUserDefinedLiteral,
-                                          bool Unevaluated);
+  ExprResult
+  ParseStringLiteralExpression(bool AllowUserDefinedLiteral, bool Unevaluated,
+                               ConversionAction CA = CA_ToLiteralEncoding);
 
   /// This routine is called when the '@' is seen and consumed.
   /// Current token is an Identifier and is not a 'try'. This
@@ -5716,7 +5717,6 @@ class Parser : public CodeCompletionHandler {
     bool Finished;
   };
   ObjCImplParsingDataRAII *CurParsedObjCImpl;
-  ConversionAction ParserConversionAction;
 
   /// StashAwayMethodOrFunctionBodyTokens -  Consume the tokens and store them
   /// for later parsing.
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 1bb0026d8422e..1cc49cf84ce4c 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -198,6 +198,8 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
   MaxOpenCLWorkGroupSize = 1024;
 
   MaxBitIntWidth.reset();
+
+  TargetStrConverter = nullptr;
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Frontend/CompilerInstance.cpp 
b/clang/lib/Frontend/CompilerInstance.cpp
index 66662a786e6fc..5179696041b66 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -563,8 +563,8 @@ void 
CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) {
   if (GetDependencyDirectives)
     PP->setDependencyDirectivesGetter(*GetDependencyDirectives);
 
-  if (auto EC = TextEncoding::setConvertersFromOptions(PP->getTextEncoding(),
-                                                       getLangOpts()))
+  if (auto EC = TextEncoding::setConvertersFromOptions(
+          PP->getTextEncoding(), getLangOpts(), getTarget()))
     PP->getDiagnostics().Report(clang::diag::err_fe_text_encoding_config)
         << PP->getTextEncoding().getLiteralEncoding();
 }
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index eb4fde8928a68..effd05185faf7 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -17,6 +17,8 @@ TextEncoding::getConverter(ConversionAction Action) const {
   switch (Action) {
   case CA_ToLiteralEncoding:
     return ToLiteralEncodingConverter.get();
+  case CA_ToSystemEncoding:
+    return ToSystemEncodingConverter.get();
   default:
     return nullptr;
   }
@@ -24,23 +26,46 @@ TextEncoding::getConverter(ConversionAction Action) const {
 
 std::error_code
 TextEncoding::setConvertersFromOptions(TextEncoding &TE,
-                                       const clang::LangOptions &Opts) {
+                                       const clang::LangOptions &Opts,
+                                       clang::TargetInfo &TInfo) {
   using namespace llvm;
 
   const char *UTF8 = "UTF-8";
   TE.LiteralEncoding =
       Opts.LiteralEncoding.empty() ? UTF8 : Opts.LiteralEncoding.c_str();
 
-  // Create converter between internal and literal encoding specified
-  // in fexec-charset option.
-  if (TE.LiteralEncoding == UTF8)
+  if (TE.LiteralEncoding != UTF8) {
+    ErrorOr<TextEncodingConverter> ErrorOrLiteralConverter =
+        llvm::TextEncodingConverter::create(UTF8, TE.LiteralEncoding);
+    if (ErrorOrLiteralConverter)
+      TE.ToLiteralEncodingConverter = std::make_unique<TextEncodingConverter>(
+          std::move(*ErrorOrLiteralConverter));
+    else
+      return ErrorOrLiteralConverter.getError();
+  }
+
+  if (TInfo.getDefaultOrdinaryLiteralEncoding() == UTF8)
     return std::error_code();
+
+  // Create converter between internal and default ordinary encoding for the
+  // target
   ErrorOr<TextEncodingConverter> ErrorOrConverter =
-      llvm::TextEncodingConverter::create(UTF8, TE.LiteralEncoding);
+      llvm::TextEncodingConverter::create(
+          UTF8, TInfo.getDefaultOrdinaryLiteralEncoding());
+  if (ErrorOrConverter)
+    TE.ToSystemEncodingConverter =
+        std::make_unique<TextEncodingConverter>(std::move(*ErrorOrConverter));
+  else
+    return ErrorOrConverter.getError();
+
+  ErrorOrConverter = llvm::TextEncodingConverter::create(
+      TInfo.getDefaultOrdinaryLiteralEncoding(), UTF8);
+
   if (ErrorOrConverter)
-    TE.ToLiteralEncodingConverter =
+    TInfo.TargetStrConverter =
         std::make_unique<TextEncodingConverter>(std::move(*ErrorOrConverter));
   else
     return ErrorOrConverter.getError();
+
   return std::error_code();
 }
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp
index 06482f6b65426..e7830c536f7a7 100644
--- a/clang/lib/Parse/ParseExpr.cpp
+++ b/clang/lib/Parse/ParseExpr.cpp
@@ -3021,7 +3021,8 @@ ExprResult 
Parser::ParseUnevaluatedStringLiteralExpression() {
 }
 
 ExprResult Parser::ParseStringLiteralExpression(bool AllowUserDefinedLiteral,
-                                                bool Unevaluated) {
+                                                bool Unevaluated,
+                                                ConversionAction CA) {
   assert(tokenIsLikeStringLiteral(Tok, getLangOpts()) &&
          "Not a string-literal-like token!");
 
@@ -3042,8 +3043,7 @@ ExprResult Parser::ParseStringLiteralExpression(bool 
AllowUserDefinedLiteral,
 
   // Pass the set of string tokens, ready for concatenation, to the actions.
   return Actions.ActOnStringLiteral(
-      StringToks, AllowUserDefinedLiteral ? getCurScope() : nullptr,
-      ParserConversionAction);
+      StringToks, AllowUserDefinedLiteral ? getCurScope() : nullptr, CA);
 }
 
 ExprResult Parser::ParseGenericSelectionExpression() {
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 72c6808d51716..d6856206d900b 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -70,8 +70,6 @@ Parser::Parser(Preprocessor &pp, Sema &actions, bool 
skipFunctionBodies)
   NumCachedScopes = 0;
   CurParsedObjCImpl = nullptr;
 
-  ParserConversionAction = CA_ToLiteralEncoding;
-
   // Add #pragma handlers. These are removed and destroyed in the
   // destructor.
   initializePragmaHandlers();
@@ -1554,12 +1552,12 @@ void Parser::ParseKNRParamDeclarations(Declarator &D) {
 }
 
 ExprResult Parser::ParseAsmStringLiteral(bool ForAsmLabel) {
-  SaveAndRestore<ConversionAction> 
SavedTranslationState(ParserConversionAction,
-                                                         CA_NoConversion);
 
   ExprResult AsmString;
   if (isTokenStringLiteral()) {
-    AsmString = ParseStringLiteralExpression();
+    AsmString = ParseStringLiteralExpression(/*AllowUserDefinedLiteral=*/false,
+                                             /*Unevaluated=*/false,
+                                             CA_ToSystemEncoding);
     if (AsmString.isInvalid())
       return AsmString;
 
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index 6bf12d9cd98da..f1aab455b4411 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/lib/Sema/SemaStmtAsm.cpp
@@ -245,6 +245,14 @@ ExprResult Sema::ActOnGCCAsmStmtString(Expr *Expr, bool 
ForAsmLabel) {
       Diag(Expr->getBeginLoc(), diag::err_asm_operand_empty_string)
           << SL->getSourceRange();
     }
+    if (Context.getTargetInfo().TargetStrConverter) {
+      SmallString<16> ConvertedAsm;
+      Context.getTargetInfo().TargetStrConverter->convert(SL->getString(),
+                                                          ConvertedAsm);
+      return StringLiteral::Create(Context, ConvertedAsm,
+                                   StringLiteralKind::Ordinary,
+                                   /*Pascal*/ false, {}, SL->getBeginLoc());
+    }
     return SL;
   }
   if (DiagnoseUnexpandedParameterPack(Expr))
diff --git a/clang/test/CodeGen/systemz-charset.c 
b/clang/test/CodeGen/systemz-charset.c
index e0d1736bf853f..f3bb1055ddf5e 100644
--- a/clang/test/CodeGen/systemz-charset.c
+++ b/clang/test/CodeGen/systemz-charset.c
@@ -67,7 +67,7 @@ const char* preprocessor_concatenation = HELLO_WORLD;
 //CHECK: c"\C8\85\93\93\96@\E6\96\99\93\84Z\00"
 //CHECK-UTF8: c"Hello World!\00"
 
-void asm_labeled_fn(void) __asm__("asm_sym");
+void asm_labeled_fn(void) __asm__("\174asm_sym");
 void asm_labeled_fn(void) {}
-//CHECK: define{{.*}} void @asm_sym(
-//CHECK-UTF8: define{{.*}} void @asm_sym(
+//CHECK: define{{.*}}void @"@asm_sym"(
+//CHECK-UTF8: define{{.*}}void @"@asm_sym"(

>From 37551eee3820d46a7ea307a9fdf043e0fa0f4245 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan <[email protected]>
Date: Fri, 10 Jul 2026 15:07:07 -0400
Subject: [PATCH 4/6] address comments, attempt to fix CI

---
 clang/include/clang/Basic/TargetInfo.h |  2 +-
 clang/lib/Basic/TargetInfo.cpp         |  2 +-
 clang/lib/Lex/TextEncoding.cpp         |  2 +-
 clang/lib/Sema/SemaStmtAsm.cpp         | 10 ++++++----
 clang/test/CodeGen/systemz-charset.c   |  4 ++++
 5 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/clang/include/clang/Basic/TargetInfo.h 
b/clang/include/clang/Basic/TargetInfo.h
index dba50e03cc6d6..0518e8beb5a68 100644
--- a/clang/include/clang/Basic/TargetInfo.h
+++ b/clang/include/clang/Basic/TargetInfo.h
@@ -330,7 +330,7 @@ class TargetInfo : public TransferrableTargetInfo,
 
   virtual ~TargetInfo();
 
-  std::unique_ptr<llvm::TextEncodingConverter> TargetStrConverter;
+  std::unique_ptr<llvm::TextEncodingConverter> FromSystemEncodingConverter;
 
   /// Retrieve the target options.
   TargetOptions &getTargetOpts() const {
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 1cc49cf84ce4c..3cecb1adc6511 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -199,7 +199,7 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
 
   MaxBitIntWidth.reset();
 
-  TargetStrConverter = nullptr;
+  FromSystemEncodingConverter = nullptr;
 }
 
 // Out of line virtual dtor for TargetInfo.
diff --git a/clang/lib/Lex/TextEncoding.cpp b/clang/lib/Lex/TextEncoding.cpp
index effd05185faf7..fd59f3df59bdf 100644
--- a/clang/lib/Lex/TextEncoding.cpp
+++ b/clang/lib/Lex/TextEncoding.cpp
@@ -62,7 +62,7 @@ TextEncoding::setConvertersFromOptions(TextEncoding &TE,
       TInfo.getDefaultOrdinaryLiteralEncoding(), UTF8);
 
   if (ErrorOrConverter)
-    TInfo.TargetStrConverter =
+    TInfo.FromSystemEncodingConverter =
         std::make_unique<TextEncodingConverter>(std::move(*ErrorOrConverter));
   else
     return ErrorOrConverter.getError();
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index f1aab455b4411..8b61228db3533 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/lib/Sema/SemaStmtAsm.cpp
@@ -245,13 +245,15 @@ ExprResult Sema::ActOnGCCAsmStmtString(Expr *Expr, bool 
ForAsmLabel) {
       Diag(Expr->getBeginLoc(), diag::err_asm_operand_empty_string)
           << SL->getSourceRange();
     }
-    if (Context.getTargetInfo().TargetStrConverter) {
+    if (Context.getTargetInfo().FromSystemEncodingConverter) {
       SmallString<16> ConvertedAsm;
-      Context.getTargetInfo().TargetStrConverter->convert(SL->getString(),
-                                                          ConvertedAsm);
+      Context.getTargetInfo().FromSystemEncodingConverter->convert(
+          SL->getString(), ConvertedAsm);
+      QualType StrTy = Context.getStringLiteralArrayType(Context.CharTy,
+                                                         ConvertedAsm.size());
       return StringLiteral::Create(Context, ConvertedAsm,
                                    StringLiteralKind::Ordinary,
-                                   /*Pascal*/ false, {}, SL->getBeginLoc());
+                                   /*Pascal*/ false, StrTy, SL->getBeginLoc());
     }
     return SL;
   }
diff --git a/clang/test/CodeGen/systemz-charset.c 
b/clang/test/CodeGen/systemz-charset.c
index f3bb1055ddf5e..4ccc9934e4bde 100644
--- a/clang/test/CodeGen/systemz-charset.c
+++ b/clang/test/CodeGen/systemz-charset.c
@@ -71,3 +71,7 @@ void asm_labeled_fn(void) __asm__("\174asm_sym");
 void asm_labeled_fn(void) {}
 //CHECK: define{{.*}}void @"@asm_sym"(
 //CHECK-UTF8: define{{.*}}void @"@asm_sym"(
+
+void asm_stmt_fn(void) { __asm__("\225\226\227nop"); }
+//CHECK: call void asm{{.*}}"nopnop"
+//CHECK-UTF8: call void asm{{.*}}"nopnop"

>From 2154174e05f76e09fc687afbe41dac17384e123d Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan <[email protected]>
Date: Fri, 17 Jul 2026 14:31:50 -0400
Subject: [PATCH 5/6] check for UTF-8 to avoid conversion codepath if no
 conversion is needed

---
 clang/lib/Sema/SemaStmtAsm.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index 8b61228db3533..e0c3f7c7fd84f 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/lib/Sema/SemaStmtAsm.cpp
@@ -245,7 +245,7 @@ ExprResult Sema::ActOnGCCAsmStmtString(Expr *Expr, bool 
ForAsmLabel) {
       Diag(Expr->getBeginLoc(), diag::err_asm_operand_empty_string)
           << SL->getSourceRange();
     }
-    if (Context.getTargetInfo().FromSystemEncodingConverter) {
+    if (Context.getTargetInfo().FromSystemEncodingConverter != nullptr) {
       SmallString<16> ConvertedAsm;
       Context.getTargetInfo().FromSystemEncodingConverter->convert(
           SL->getString(), ConvertedAsm);

>From 2f6969e7a9d317fdb8edec0c8bcf1c2b88124ed5 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan <[email protected]>
Date: Tue, 11 Aug 2026 09:02:17 -0400
Subject: [PATCH 6/6] Remove unrelated testcases

---
 clang/test/CodeGen/systemz-charset-diag.cpp | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/clang/test/CodeGen/systemz-charset-diag.cpp 
b/clang/test/CodeGen/systemz-charset-diag.cpp
index ad08e1f391214..4ed94810150a3 100644
--- a/clang/test/CodeGen/systemz-charset-diag.cpp
+++ b/clang/test/CodeGen/systemz-charset-diag.cpp
@@ -1,11 +1,3 @@
 // RUN: %clang_cc1 -triple s390x-none-zos -fexec-charset IBM-1047 %s 
-std=c++17 -emit-llvm -o - -verify
 
 const char* Computer = "🖥️"; // expected-error-re {{conversion to literal 
encoding failed: {{.*}}}}
-
-static_assert(false, "Error string"); // expected-error {{static assertion 
failed: Error string}}
-
-[[deprecated("message")]] void test_deprecated() {return;} // expected-note 
{{'test_deprecated' has been explicitly marked deprecated here}}
-
-int main() {
-  test_deprecated(); // expected-warning {{'test_deprecated' is deprecated: 
message}}
-}

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

Reply via email to