Skip to content

Commit 28c6b87

Browse files
committed
replace StringMap with pointer
1 parent 222d181 commit 28c6b87

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
@@ -565,8 +565,8 @@ class LangOptions : public LangOptionsBase {
565565
bool AtomicFineGrainedMemory = false;
566566
bool AtomicIgnoreDenormalMode = false;
567567

568-
/// Name of the exec charset to convert the internal charset to.
569-
std::string ExecCharset;
568+
/// Name of the execution encoding to convert the internal encoding to.
569+
std::string ExecEncoding;
570570

571571
LangOptions();
572572

clang/include/clang/Driver/Options.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7471,7 +7471,7 @@ def fexec_charset : Separate<["-"], "fexec-charset">, MetaVarName<"<charset>">,
74717471
HelpText<"Set the execution <charset> for string and character literals. "
74727472
"Supported character encodings include ISO8859-1, UTF-8, IBM-1047 "
74737473
"and those supported by the host icu or iconv library.">,
7474-
MarshallingInfoString<LangOpts<"ExecCharset">>;
7474+
MarshallingInfoString<LangOpts<"ExecEncoding">>;
74757475
def target_cpu : Separate<["-"], "target-cpu">,
74767476
HelpText<"Target a specific cpu type">,
74777477
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
@@ -7419,17 +7419,17 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
74197419

74207420
// Set the default fexec-charset as the system charset.
74217421
CmdArgs.push_back("-fexec-charset");
7422-
CmdArgs.push_back(Args.MakeArgString(Triple.getSystemCharset()));
7423-
if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
7424-
StringRef value = execCharset->getValue();
7422+
CmdArgs.push_back(Args.MakeArgString(Triple.getDefaultTextEncoding()));
7423+
if (Arg *execEncoding = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
7424+
StringRef value = execEncoding->getValue();
74257425
llvm::ErrorOr<llvm::TextEncodingConverter> ErrorOrConverter =
74267426
llvm::TextEncodingConverter::create("UTF-8", value.data());
74277427
if (ErrorOrConverter) {
74287428
CmdArgs.push_back("-fexec-charset");
74297429
CmdArgs.push_back(Args.MakeArgString(value));
74307430
} else {
74317431
D.Diag(diag::err_drv_invalid_value)
7432-
<< execCharset->getAsString(Args) << value;
7432+
<< execEncoding->getAsString(Args) << value;
74337433
}
74347434
}
74357435

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
@@ -506,8 +506,8 @@ class Triple {
506506
/// For example, "fooos1.2.3" would return "1.2.3".
507507
LLVM_ABI StringRef getEnvironmentVersionString() const;
508508

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

512512
/// @}
513513
/// @name Convenience Predicates

0 commit comments

Comments
 (0)