Skip to content

Commit 304a0ed

Browse files
committed
replace StringMap with pointer
1 parent fd8d672 commit 304a0ed

File tree

11 files changed

+50
-66
lines changed

11 files changed

+50
-66
lines changed

clang/docs/LanguageExtensions.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,9 @@ Builtin Macros
419419

420420
``__clang_literal_encoding__``
421421
Defined to a narrow string literal that represents the current encoding of
422-
narrow string literals, e.g., ``"hello"``. This macro typically expands to
423-
the text encoding specified by -fexec-charset if specified, or the system charset.
422+
narrow string literals, e.g., ``"hello"``. This macro expands to the text
423+
encoding specified by ``-fexec-charset`` if any, or a system-specific default
424+
otherwise: ``"IBM-1047"`` on z/OS and ``"UTF-8"`` on all other systems.
424425

425426
``__clang_wide_literal_encoding__``
426427
Defined to a narrow string literal that represents the current encoding of

clang/include/clang/Basic/LangOptions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -573,8 +573,8 @@ class LangOptions : public LangOptionsBase {
573573
/// The allocation token mode.
574574
std::optional<llvm::AllocTokenMode> AllocTokenMode;
575575

576-
/// Name of the exec charset to convert the internal charset to.
577-
std::string ExecCharset;
576+
/// Name of the execution encoding to convert the internal encoding to.
577+
std::string ExecEncoding;
578578

579579
LangOptions();
580580

clang/include/clang/Driver/Options.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7477,7 +7477,7 @@ def fexec_charset : Separate<["-"], "fexec-charset">, MetaVarName<"<charset>">,
74777477
HelpText<"Set the execution <charset> for string and character literals. "
74787478
"Supported character encodings include ISO8859-1, UTF-8, IBM-1047 "
74797479
"and those supported by the host icu or iconv library.">,
7480-
MarshallingInfoString<LangOpts<"ExecCharset">>;
7480+
MarshallingInfoString<LangOpts<"ExecEncoding">>;
74817481
def target_cpu : Separate<["-"], "target-cpu">,
74827482
HelpText<"Target a specific cpu type">,
74837483
MarshallingInfoString<TargetOpts<"CPU">>;

clang/include/clang/Lex/LiteralConverter.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@
1616
#include "llvm/ADT/StringRef.h"
1717
#include "llvm/Support/TextEncoding.h"
1818

19-
enum ConversionAction { NoConversion, ToSystemCharset, ToExecCharset };
19+
enum ConversionAction { NoConversion, ToSystemEncoding, ToExecEncoding };
2020

2121
class LiteralConverter {
22-
llvm::StringRef InternalCharset;
23-
llvm::StringRef SystemCharset;
24-
llvm::StringRef ExecCharset;
25-
llvm::StringMap<llvm::TextEncodingConverter> TextEncodingConverters;
22+
llvm::StringRef InternalEncoding;
23+
llvm::StringRef SystemEncoding;
24+
llvm::StringRef ExecEncoding;
25+
llvm::TextEncodingConverter *ToSystemEncodingConverter;
26+
llvm::TextEncodingConverter *ToExecEncodingConverter;
2627

2728
public:
28-
llvm::TextEncodingConverter *getConverter(const char *Codepage);
2929
llvm::TextEncodingConverter *getConverter(ConversionAction Action);
30-
llvm::TextEncodingConverter *createAndInsertCharConverter(const char *To);
3130
void setConvertersFromOptions(const clang::LangOptions &Opts,
3231
const clang::TargetInfo &TInfo,
3332
clang::DiagnosticsEngine &Diags);

clang/include/clang/Lex/LiteralSupport.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ class StringLiteralParser {
251251
StringLiteralParser(
252252
ArrayRef<Token> StringToks, Preprocessor &PP,
253253
StringLiteralEvalMethod StringMethod = StringLiteralEvalMethod::Evaluated,
254-
ConversionAction Action = ToExecCharset);
254+
ConversionAction Action = ToExecEncoding);
255255
StringLiteralParser(ArrayRef<Token> StringToks, const SourceManager &sm,
256256
const LangOptions &features, const TargetInfo &target,
257257
DiagnosticsEngine *diags = nullptr)

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7366,17 +7366,17 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
73667366

73677367
// Set the default fexec-charset as the system charset.
73687368
CmdArgs.push_back("-fexec-charset");
7369-
CmdArgs.push_back(Args.MakeArgString(Triple.getSystemCharset()));
7370-
if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
7371-
StringRef value = execCharset->getValue();
7369+
CmdArgs.push_back(Args.MakeArgString(Triple.getDefaultTextEncoding()));
7370+
if (Arg *execEncoding = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
7371+
StringRef value = execEncoding->getValue();
73727372
llvm::ErrorOr<llvm::TextEncodingConverter> ErrorOrConverter =
73737373
llvm::TextEncodingConverter::create("UTF-8", value.data());
73747374
if (ErrorOrConverter) {
73757375
CmdArgs.push_back("-fexec-charset");
73767376
CmdArgs.push_back(Args.MakeArgString(value));
73777377
} else {
73787378
D.Diag(diag::err_drv_invalid_value)
7379-
<< execCharset->getAsString(Args) << value;
7379+
<< execEncoding->getAsString(Args) << value;
73807380
}
73817381
}
73827382

clang/lib/Frontend/InitPreprocessor.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,11 +1025,11 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
10251025
// Macros to help identify the narrow and wide character sets. This is set
10261026
// to fexec-charset. If fexec-charset is not specified, the default is the
10271027
// system charset.
1028-
if (!LangOpts.ExecCharset.empty())
1029-
Builder.defineMacro("__clang_literal_encoding__", LangOpts.ExecCharset);
1028+
if (!LangOpts.ExecEncoding.empty())
1029+
Builder.defineMacro("__clang_literal_encoding__", LangOpts.ExecEncoding);
10301030
else
10311031
Builder.defineMacro("__clang_literal_encoding__",
1032-
TI.getTriple().getSystemCharset());
1032+
TI.getTriple().getDefaultTextEncoding());
10331033
if (TI.getTypeWidth(TI.getWCharType()) >= 32) {
10341034
// FIXME: 32-bit wchar_t signals UTF-32. This may change
10351035
// if -fwide-exec-charset= is ever supported.

clang/lib/Lex/LiteralConverter.cpp

Lines changed: 25 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,59 +11,43 @@
1111

1212
using namespace llvm;
1313

14-
llvm::TextEncodingConverter *
15-
LiteralConverter::getConverter(const char *Codepage) {
16-
auto Iter = TextEncodingConverters.find(Codepage);
17-
if (Iter != TextEncodingConverters.end())
18-
return &Iter->second;
19-
return nullptr;
20-
}
21-
2214
llvm::TextEncodingConverter *
2315
LiteralConverter::getConverter(ConversionAction Action) {
24-
StringRef CodePage;
25-
if (Action == ToSystemCharset)
26-
CodePage = SystemCharset;
27-
else if (Action == ToExecCharset)
28-
CodePage = ExecCharset;
16+
if (Action == ToSystemEncoding)
17+
return ToSystemEncodingConverter;
18+
else if (Action == ToExecEncoding)
19+
return ToExecEncodingConverter;
2920
else
30-
CodePage = InternalCharset;
31-
return getConverter(CodePage.data());
32-
}
33-
34-
llvm::TextEncodingConverter *
35-
LiteralConverter::createAndInsertCharConverter(const char *To) {
36-
const char *From = InternalCharset.data();
37-
llvm::TextEncodingConverter *Converter = getConverter(To);
38-
if (Converter)
39-
return Converter;
40-
41-
ErrorOr<TextEncodingConverter> ErrorOrConverter =
42-
llvm::TextEncodingConverter::create(From, To);
43-
if (!ErrorOrConverter)
4421
return nullptr;
45-
TextEncodingConverters.insert_or_assign(StringRef(To),
46-
std::move(*ErrorOrConverter));
47-
return getConverter(To);
4822
}
4923

5024
void LiteralConverter::setConvertersFromOptions(
5125
const clang::LangOptions &Opts, const clang::TargetInfo &TInfo,
5226
clang::DiagnosticsEngine &Diags) {
5327
using namespace llvm;
54-
SystemCharset = TInfo.getTriple().getSystemCharset();
55-
InternalCharset = "UTF-8";
56-
ExecCharset = Opts.ExecCharset.empty() ? InternalCharset : Opts.ExecCharset;
57-
// Create converter between internal and system charset
58-
if (InternalCharset != SystemCharset)
59-
createAndInsertCharConverter(SystemCharset.data());
28+
InternalEncoding = "UTF-8";
29+
SystemEncoding = TInfo.getTriple().getDefaultTextEncoding();
30+
ExecEncoding =
31+
Opts.ExecEncoding.empty() ? InternalEncoding : Opts.ExecEncoding;
32+
// Create converter between internal and system encoding
33+
if (InternalEncoding != SystemEncoding) {
34+
ErrorOr<TextEncodingConverter> ErrorOrConverter =
35+
llvm::TextEncodingConverter::create(InternalEncoding, SystemEncoding);
36+
if (!ErrorOrConverter)
37+
return;
38+
ToSystemEncodingConverter =
39+
new TextEncodingConverter(std::move(*ErrorOrConverter));
40+
}
6041

61-
// Create converter between internal and exec charset specified
42+
// Create converter between internal and exec encoding specified
6243
// in fexec-charset option.
63-
if (InternalCharset == ExecCharset)
44+
if (InternalEncoding == ExecEncoding)
6445
return;
65-
if (!createAndInsertCharConverter(ExecCharset.data())) {
46+
ErrorOr<TextEncodingConverter> ErrorOrConverter =
47+
llvm::TextEncodingConverter::create(InternalEncoding, ExecEncoding);
48+
if (!ErrorOrConverter)
6649
Diags.Report(clang::diag::err_drv_invalid_value)
67-
<< "-fexec-charset" << ExecCharset;
68-
}
50+
<< "-fexec-charset" << ExecEncoding;
51+
ToExecEncodingConverter =
52+
new TextEncodingConverter(std::move(*ErrorOrConverter));
6953
}

clang/lib/Lex/LiteralSupport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1835,7 +1835,7 @@ CharLiteralParser::CharLiteralParser(const char *begin, const char *end,
18351835

18361836
llvm::TextEncodingConverter *Converter = nullptr;
18371837
if (!isUTFLiteral(Kind) && LiteralConv)
1838-
Converter = LiteralConv->getConverter(ToExecCharset);
1838+
Converter = LiteralConv->getConverter(ToExecEncoding);
18391839

18401840
while (begin != end) {
18411841
// Is this a span of non-escape characters?

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,8 +507,8 @@ class Triple {
507507
/// For example, "fooos1.2.3" would return "1.2.3".
508508
LLVM_ABI StringRef getEnvironmentVersionString() const;
509509

510-
/// getSystemCharset - Get the system charset of the triple.
511-
StringRef getSystemCharset() const;
510+
/// getDefaultTextEncoding - Get the default encoding of the triple.
511+
StringRef getDefaultTextEncoding() const;
512512

513513
/// @}
514514
/// @name Convenience Predicates

0 commit comments

Comments
 (0)