replace StringMap with pointer
diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst
index be612d4..e94b38e 100644
--- a/clang/docs/LanguageExtensions.rst
+++ b/clang/docs/LanguageExtensions.rst
@@ -415,8 +415,9 @@
``__clang_literal_encoding__``
Defined to a narrow string literal that represents the current encoding of
- narrow string literals, e.g., ``"hello"``. This macro typically expands to
- the text encoding specified by -fexec-charset if specified, or the system charset.
+ narrow string literals, e.g., ``"hello"``. This macro expands to the text
+ encoding specified by ``-fexec-charset`` if any, or a system-specific default
+ otherwise: ``"IBM-1047"`` on z/OS and ``"UTF-8"`` on all other systems.
``__clang_wide_literal_encoding__``
Defined to a narrow string literal that represents the current encoding of
diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h
index 559a4be..ecf92ce 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -633,8 +633,8 @@
bool AtomicFineGrainedMemory = false;
bool AtomicIgnoreDenormalMode = false;
- /// Name of the exec charset to convert the internal charset to.
- std::string ExecCharset;
+ /// Name of the execution encoding to convert the internal encoding to.
+ std::string ExecEncoding;
LangOptions();
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 2da791b..f7aa659 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -7251,7 +7251,7 @@
HelpText<"Set the execution <charset> for string and character literals. "
"Supported character encodings include ISO8859-1, UTF-8, IBM-1047 "
"and those supported by the host icu or iconv library.">,
- MarshallingInfoString<LangOpts<"ExecCharset">>;
+ MarshallingInfoString<LangOpts<"ExecEncoding">>;
def target_cpu : Separate<["-"], "target-cpu">,
HelpText<"Target a specific cpu type">,
MarshallingInfoString<TargetOpts<"CPU">>;
diff --git a/clang/include/clang/Lex/LiteralConverter.h b/clang/include/clang/Lex/LiteralConverter.h
index 999b2c1..ee489bf 100644
--- a/clang/include/clang/Lex/LiteralConverter.h
+++ b/clang/include/clang/Lex/LiteralConverter.h
@@ -16,18 +16,17 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/TextEncoding.h"
-enum ConversionAction { NoConversion, ToSystemCharset, ToExecCharset };
+enum ConversionAction { NoConversion, ToSystemEncoding, ToExecEncoding };
class LiteralConverter {
- llvm::StringRef InternalCharset;
- llvm::StringRef SystemCharset;
- llvm::StringRef ExecCharset;
- llvm::StringMap<llvm::TextEncodingConverter> TextEncodingConverters;
+ llvm::StringRef InternalEncoding;
+ llvm::StringRef SystemEncoding;
+ llvm::StringRef ExecEncoding;
+ llvm::TextEncodingConverter *ToSystemEncodingConverter;
+ llvm::TextEncodingConverter *ToExecEncodingConverter;
public:
- llvm::TextEncodingConverter *getConverter(const char *Codepage);
llvm::TextEncodingConverter *getConverter(ConversionAction Action);
- llvm::TextEncodingConverter *createAndInsertCharConverter(const char *To);
void setConvertersFromOptions(const clang::LangOptions &Opts,
const clang::TargetInfo &TInfo,
clang::DiagnosticsEngine &Diags);
diff --git a/clang/include/clang/Lex/LiteralSupport.h b/clang/include/clang/Lex/LiteralSupport.h
index eaa2016..af02969 100644
--- a/clang/include/clang/Lex/LiteralSupport.h
+++ b/clang/include/clang/Lex/LiteralSupport.h
@@ -251,7 +251,7 @@
StringLiteralParser(
ArrayRef<Token> StringToks, Preprocessor &PP,
StringLiteralEvalMethod StringMethod = StringLiteralEvalMethod::Evaluated,
- ConversionAction Action = ToExecCharset);
+ ConversionAction Action = ToExecEncoding);
StringLiteralParser(ArrayRef<Token> StringToks, const SourceManager &sm,
const LangOptions &features, const TargetInfo &target,
DiagnosticsEngine *diags = nullptr)
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index cc20aad..aaab97d 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -7592,9 +7592,9 @@
// Set the default fexec-charset as the system charset.
CmdArgs.push_back("-fexec-charset");
- CmdArgs.push_back(Args.MakeArgString(Triple.getSystemCharset()));
- if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
- StringRef value = execCharset->getValue();
+ CmdArgs.push_back(Args.MakeArgString(Triple.getDefaultTextEncoding()));
+ if (Arg *execEncoding = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
+ StringRef value = execEncoding->getValue();
llvm::ErrorOr<llvm::TextEncodingConverter> ErrorOrConverter =
llvm::TextEncodingConverter::create("UTF-8", value.data());
if (ErrorOrConverter) {
@@ -7602,7 +7602,7 @@
CmdArgs.push_back(Args.MakeArgString(value));
} else {
D.Diag(diag::err_drv_invalid_value)
- << execCharset->getAsString(Args) << value;
+ << execEncoding->getAsString(Args) << value;
}
}
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp
index 39b684a..54a0348 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -1060,11 +1060,11 @@
// Macros to help identify the narrow and wide character sets. This is set
// to fexec-charset. If fexec-charset is not specified, the default is the
// system charset.
- if (!LangOpts.ExecCharset.empty())
- Builder.defineMacro("__clang_literal_encoding__", LangOpts.ExecCharset);
+ if (!LangOpts.ExecEncoding.empty())
+ Builder.defineMacro("__clang_literal_encoding__", LangOpts.ExecEncoding);
else
Builder.defineMacro("__clang_literal_encoding__",
- TI.getTriple().getSystemCharset());
+ TI.getTriple().getDefaultTextEncoding());
if (TI.getTypeWidth(TI.getWCharType()) >= 32) {
// FIXME: 32-bit wchar_t signals UTF-32. This may change
// if -fwide-exec-charset= is ever supported.
diff --git a/clang/lib/Lex/LiteralConverter.cpp b/clang/lib/Lex/LiteralConverter.cpp
index b00f44a..e9f8981 100644
--- a/clang/lib/Lex/LiteralConverter.cpp
+++ b/clang/lib/Lex/LiteralConverter.cpp
@@ -12,58 +12,42 @@
using namespace llvm;
llvm::TextEncodingConverter *
-LiteralConverter::getConverter(const char *Codepage) {
- auto Iter = TextEncodingConverters.find(Codepage);
- if (Iter != TextEncodingConverters.end())
- return &Iter->second;
- return nullptr;
-}
-
-llvm::TextEncodingConverter *
LiteralConverter::getConverter(ConversionAction Action) {
- StringRef CodePage;
- if (Action == ToSystemCharset)
- CodePage = SystemCharset;
- else if (Action == ToExecCharset)
- CodePage = ExecCharset;
+ if (Action == ToSystemEncoding)
+ return ToSystemEncodingConverter;
+ else if (Action == ToExecEncoding)
+ return ToExecEncodingConverter;
else
- CodePage = InternalCharset;
- return getConverter(CodePage.data());
-}
-
-llvm::TextEncodingConverter *
-LiteralConverter::createAndInsertCharConverter(const char *To) {
- const char *From = InternalCharset.data();
- llvm::TextEncodingConverter *Converter = getConverter(To);
- if (Converter)
- return Converter;
-
- ErrorOr<TextEncodingConverter> ErrorOrConverter =
- llvm::TextEncodingConverter::create(From, To);
- if (!ErrorOrConverter)
return nullptr;
- TextEncodingConverters.insert_or_assign(StringRef(To),
- std::move(*ErrorOrConverter));
- return getConverter(To);
}
void LiteralConverter::setConvertersFromOptions(
const clang::LangOptions &Opts, const clang::TargetInfo &TInfo,
clang::DiagnosticsEngine &Diags) {
using namespace llvm;
- SystemCharset = TInfo.getTriple().getSystemCharset();
- InternalCharset = "UTF-8";
- ExecCharset = Opts.ExecCharset.empty() ? InternalCharset : Opts.ExecCharset;
- // Create converter between internal and system charset
- if (InternalCharset != SystemCharset)
- createAndInsertCharConverter(SystemCharset.data());
-
- // Create converter between internal and exec charset specified
- // in fexec-charset option.
- if (InternalCharset == ExecCharset)
- return;
- if (!createAndInsertCharConverter(ExecCharset.data())) {
- Diags.Report(clang::diag::err_drv_invalid_value)
- << "-fexec-charset" << ExecCharset;
+ InternalEncoding = "UTF-8";
+ SystemEncoding = TInfo.getTriple().getDefaultTextEncoding();
+ ExecEncoding =
+ Opts.ExecEncoding.empty() ? InternalEncoding : Opts.ExecEncoding;
+ // Create converter between internal and system encoding
+ if (InternalEncoding != SystemEncoding) {
+ ErrorOr<TextEncodingConverter> ErrorOrConverter =
+ llvm::TextEncodingConverter::create(InternalEncoding, SystemEncoding);
+ if (!ErrorOrConverter)
+ return;
+ ToSystemEncodingConverter =
+ new TextEncodingConverter(std::move(*ErrorOrConverter));
}
+
+ // Create converter between internal and exec encoding specified
+ // in fexec-charset option.
+ if (InternalEncoding == ExecEncoding)
+ return;
+ ErrorOr<TextEncodingConverter> ErrorOrConverter =
+ llvm::TextEncodingConverter::create(InternalEncoding, ExecEncoding);
+ if (!ErrorOrConverter)
+ Diags.Report(clang::diag::err_drv_invalid_value)
+ << "-fexec-charset" << ExecEncoding;
+ ToExecEncodingConverter =
+ new TextEncodingConverter(std::move(*ErrorOrConverter));
}
diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp
index 622d758..6827e32 100644
--- a/clang/lib/Lex/LiteralSupport.cpp
+++ b/clang/lib/Lex/LiteralSupport.cpp
@@ -1835,7 +1835,7 @@
llvm::TextEncodingConverter *Converter = nullptr;
if (!isUTFLiteral(Kind) && LiteralConv)
- Converter = LiteralConv->getConverter(ToExecCharset);
+ Converter = LiteralConv->getConverter(ToExecEncoding);
while (begin != end) {
// Is this a span of non-escape characters?
diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
index 059c176..1ec34b9 100644
--- a/llvm/include/llvm/TargetParser/Triple.h
+++ b/llvm/include/llvm/TargetParser/Triple.h
@@ -491,8 +491,8 @@
/// For example, "fooos1.2.3" would return "1.2.3".
StringRef getEnvironmentVersionString() const;
- /// getSystemCharset - Get the system charset of the triple.
- StringRef getSystemCharset() const;
+ /// getDefaultTextEncoding - Get the default encoding of the triple.
+ StringRef getDefaultTextEncoding() const;
/// @}
/// @name Convenience Predicates
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 4f55d05..772fdd8 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -1384,8 +1384,8 @@
return Tmp.split('-').second; // Strip second component
}
-// System charset on z/OS is IBM-1047 and UTF-8 otherwise
-StringRef Triple::getSystemCharset() const {
+// Default encoding on z/OS is IBM-1047 and UTF-8 otherwise
+StringRef Triple::getDefaultTextEncoding() const {
if (getOS() == llvm::Triple::ZOS)
return "IBM-1047";
return "UTF-8";