Skip to content

Commit 9ff4728

Browse files
committed
replace StringMap with pointer
1 parent 718c50e commit 9ff4728

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
@@ -415,8 +415,9 @@ Builtin Macros
415415

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

421422
``__clang_wide_literal_encoding__``
422423
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
@@ -633,8 +633,8 @@ class LangOptions : public LangOptionsBase {
633633
bool AtomicFineGrainedMemory = false;
634634
bool AtomicIgnoreDenormalMode = false;
635635

636-
/// Name of the exec charset to convert the internal charset to.
637-
std::string ExecCharset;
636+
/// Name of the execution encoding to convert the internal encoding to.
637+
std::string ExecEncoding;
638638

639639
LangOptions();
640640

clang/include/clang/Driver/Options.td

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

75937593
// Set the default fexec-charset as the system charset.
75947594
CmdArgs.push_back("-fexec-charset");
7595-
CmdArgs.push_back(Args.MakeArgString(Triple.getSystemCharset()));
7596-
if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
7597-
StringRef value = execCharset->getValue();
7595+
CmdArgs.push_back(Args.MakeArgString(Triple.getDefaultTextEncoding()));
7596+
if (Arg *execEncoding = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
7597+
StringRef value = execEncoding->getValue();
75987598
llvm::ErrorOr<llvm::TextEncodingConverter> ErrorOrConverter =
75997599
llvm::TextEncodingConverter::create("UTF-8", value.data());
76007600
if (ErrorOrConverter) {
76017601
CmdArgs.push_back("-fexec-charset");
76027602
CmdArgs.push_back(Args.MakeArgString(value));
76037603
} else {
76047604
D.Diag(diag::err_drv_invalid_value)
7605-
<< execCharset->getAsString(Args) << value;
7605+
<< execEncoding->getAsString(Args) << value;
76067606
}
76077607
}
76087608

clang/lib/Frontend/InitPreprocessor.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,11 +1060,11 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
10601060
// Macros to help identify the narrow and wide character sets. This is set
10611061
// to fexec-charset. If fexec-charset is not specified, the default is the
10621062
// system charset.
1063-
if (!LangOpts.ExecCharset.empty())
1064-
Builder.defineMacro("__clang_literal_encoding__", LangOpts.ExecCharset);
1063+
if (!LangOpts.ExecEncoding.empty())
1064+
Builder.defineMacro("__clang_literal_encoding__", LangOpts.ExecEncoding);
10651065
else
10661066
Builder.defineMacro("__clang_literal_encoding__",
1067-
TI.getTriple().getSystemCharset());
1067+
TI.getTriple().getDefaultTextEncoding());
10681068
if (TI.getTypeWidth(TI.getWCharType()) >= 32) {
10691069
// FIXME: 32-bit wchar_t signals UTF-32. This may change
10701070
// 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
@@ -491,8 +491,8 @@ class Triple {
491491
/// For example, "fooos1.2.3" would return "1.2.3".
492492
StringRef getEnvironmentVersionString() const;
493493

494-
/// getSystemCharset - Get the system charset of the triple.
495-
StringRef getSystemCharset() const;
494+
/// getDefaultTextEncoding - Get the default encoding of the triple.
495+
StringRef getDefaultTextEncoding() const;
496496

497497
/// @}
498498
/// @name Convenience Predicates

llvm/lib/TargetParser/Triple.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,8 +1384,8 @@ StringRef Triple::getOSAndEnvironmentName() const {
13841384
return Tmp.split('-').second; // Strip second component
13851385
}
13861386

1387-
// System charset on z/OS is IBM-1047 and UTF-8 otherwise
1388-
StringRef Triple::getSystemCharset() const {
1387+
// Default encoding on z/OS is IBM-1047 and UTF-8 otherwise
1388+
StringRef Triple::getDefaultTextEncoding() const {
13891389
if (getOS() == llvm::Triple::ZOS)
13901390
return "IBM-1047";
13911391
return "UTF-8";

0 commit comments

Comments
 (0)