Skip to content

Commit 93471e6

Browse files
committed
[clang] NFC, move CompilerInvocation::setLangDefaults to LangOptions.h
The function is moved from clangFrontend to clangBasic, which allows tools (e.g. clang pseudoparser) which don't depend on clangFrontend to use. Differential Revision: https://reviews.llvm.org/D121375
1 parent 63f2d1f commit 93471e6

File tree

6 files changed

+187
-187
lines changed

6 files changed

+187
-187
lines changed

clang/include/clang/Basic/LangOptions.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,20 @@ class LangOptions : public LangOptionsBase {
450450

451451
LangOptions();
452452

453+
/// Set language defaults for the given input language and
454+
/// language standard in the given LangOptions object.
455+
///
456+
/// \param Opts - The LangOptions object to set up.
457+
/// \param Lang - The input language.
458+
/// \param T - The target triple.
459+
/// \param Includes - If the language requires extra headers to be implicitly
460+
/// included, they will be appended to this list.
461+
/// \param LangStd - The input language standard.
462+
static void
463+
setLangDefaults(LangOptions &Opts, Language Lang, const llvm::Triple &T,
464+
std::vector<std::string> &Includes,
465+
LangStandard::Kind LangStd = LangStandard::lang_unspecified);
466+
453467
// Define accessors/mutators for language options of enumeration type.
454468
#define LANGOPT(Name, Bits, Default, Description)
455469
#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \

clang/include/clang/Basic/LangStandard.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
#include "clang/Basic/LLVM.h"
1313
#include "llvm/ADT/StringRef.h"
1414

15+
namespace llvm {
16+
class Triple;
17+
}
18+
1519
namespace clang {
1620

1721
/// The language for the input, used to select and validate the language
@@ -138,6 +142,9 @@ struct LangStandard {
138142
static const LangStandard *getLangStandardForName(StringRef Name);
139143
};
140144

145+
LangStandard::Kind getDefaultLanguageStandard(clang::Language Lang,
146+
const llvm::Triple &T);
147+
141148
} // end namespace clang
142149

143150
#endif

clang/include/clang/Frontend/CompilerInvocation.h

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -219,19 +219,6 @@ class CompilerInvocation : public CompilerInvocationRefBase,
219219
/// executable), for finding the builtin compiler path.
220220
static std::string GetResourcesPath(const char *Argv0, void *MainAddr);
221221

222-
/// Set language defaults for the given input language and
223-
/// language standard in the given LangOptions object.
224-
///
225-
/// \param Opts - The LangOptions object to set up.
226-
/// \param IK - The input language.
227-
/// \param T - The target triple.
228-
/// \param Includes - The affected list of included files.
229-
/// \param LangStd - The input language standard.
230-
static void
231-
setLangDefaults(LangOptions &Opts, InputKind IK, const llvm::Triple &T,
232-
std::vector<std::string> &Includes,
233-
LangStandard::Kind LangStd = LangStandard::lang_unspecified);
234-
235222
/// Retrieve a module hash string that is suitable for uniquely
236223
/// identifying the conditions under which the module was built.
237224
std::string getModuleHash() const;

clang/lib/Basic/LangOptions.cpp

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,126 @@ std::string LangOptions::getOpenCLVersionString() const {
7878
return Result;
7979
}
8080

81+
void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang,
82+
const llvm::Triple &T,
83+
std::vector<std::string> &Includes,
84+
LangStandard::Kind LangStd) {
85+
// Set some properties which depend solely on the input kind; it would be nice
86+
// to move these to the language standard, and have the driver resolve the
87+
// input kind + language standard.
88+
//
89+
// FIXME: Perhaps a better model would be for a single source file to have
90+
// multiple language standards (C / C++ std, ObjC std, OpenCL std, OpenMP std)
91+
// simultaneously active?
92+
if (Lang == Language::Asm) {
93+
Opts.AsmPreprocessor = 1;
94+
} else if (Lang == Language::ObjC || Lang == Language::ObjCXX) {
95+
Opts.ObjC = 1;
96+
}
97+
98+
if (LangStd == LangStandard::lang_unspecified)
99+
LangStd = getDefaultLanguageStandard(Lang, T);
100+
const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
101+
Opts.LangStd = LangStd;
102+
Opts.LineComment = Std.hasLineComments();
103+
Opts.C99 = Std.isC99();
104+
Opts.C11 = Std.isC11();
105+
Opts.C17 = Std.isC17();
106+
Opts.C2x = Std.isC2x();
107+
Opts.CPlusPlus = Std.isCPlusPlus();
108+
Opts.CPlusPlus11 = Std.isCPlusPlus11();
109+
Opts.CPlusPlus14 = Std.isCPlusPlus14();
110+
Opts.CPlusPlus17 = Std.isCPlusPlus17();
111+
Opts.CPlusPlus20 = Std.isCPlusPlus20();
112+
Opts.CPlusPlus2b = Std.isCPlusPlus2b();
113+
Opts.GNUMode = Std.isGNUMode();
114+
Opts.GNUCVersion = 0;
115+
Opts.HexFloats = Std.hasHexFloats();
116+
Opts.ImplicitInt = Std.hasImplicitInt();
117+
Opts.WChar = Std.isCPlusPlus();
118+
Opts.Digraphs = Std.hasDigraphs();
119+
120+
Opts.HLSL = Lang == Language::HLSL;
121+
122+
// Set OpenCL Version.
123+
Opts.OpenCL = Std.isOpenCL();
124+
if (LangStd == LangStandard::lang_opencl10)
125+
Opts.OpenCLVersion = 100;
126+
else if (LangStd == LangStandard::lang_opencl11)
127+
Opts.OpenCLVersion = 110;
128+
else if (LangStd == LangStandard::lang_opencl12)
129+
Opts.OpenCLVersion = 120;
130+
else if (LangStd == LangStandard::lang_opencl20)
131+
Opts.OpenCLVersion = 200;
132+
else if (LangStd == LangStandard::lang_opencl30)
133+
Opts.OpenCLVersion = 300;
134+
else if (LangStd == LangStandard::lang_openclcpp10)
135+
Opts.OpenCLCPlusPlusVersion = 100;
136+
else if (LangStd == LangStandard::lang_openclcpp2021)
137+
Opts.OpenCLCPlusPlusVersion = 202100;
138+
else if (LangStd == LangStandard::lang_hlsl2015)
139+
Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2015;
140+
else if (LangStd == LangStandard::lang_hlsl2016)
141+
Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2016;
142+
else if (LangStd == LangStandard::lang_hlsl2017)
143+
Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2017;
144+
else if (LangStd == LangStandard::lang_hlsl2018)
145+
Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2018;
146+
else if (LangStd == LangStandard::lang_hlsl2021)
147+
Opts.HLSLVersion = (unsigned)LangOptions::HLSL_2021;
148+
else if (LangStd == LangStandard::lang_hlsl202x)
149+
Opts.HLSLVersion = (unsigned)LangOptions::HLSL_202x;
150+
151+
// OpenCL has some additional defaults.
152+
if (Opts.OpenCL) {
153+
Opts.AltiVec = 0;
154+
Opts.ZVector = 0;
155+
Opts.setDefaultFPContractMode(LangOptions::FPM_On);
156+
Opts.OpenCLCPlusPlus = Opts.CPlusPlus;
157+
Opts.OpenCLPipes = Opts.getOpenCLCompatibleVersion() == 200;
158+
Opts.OpenCLGenericAddressSpace = Opts.getOpenCLCompatibleVersion() == 200;
159+
160+
// Include default header file for OpenCL.
161+
if (Opts.IncludeDefaultHeader) {
162+
if (Opts.DeclareOpenCLBuiltins) {
163+
// Only include base header file for builtin types and constants.
164+
Includes.push_back("opencl-c-base.h");
165+
} else {
166+
Includes.push_back("opencl-c.h");
167+
}
168+
}
169+
}
170+
171+
Opts.HIP = Lang == Language::HIP;
172+
Opts.CUDA = Lang == Language::CUDA || Opts.HIP;
173+
if (Opts.HIP) {
174+
// HIP toolchain does not support 'Fast' FPOpFusion in backends since it
175+
// fuses multiplication/addition instructions without contract flag from
176+
// device library functions in LLVM bitcode, which causes accuracy loss in
177+
// certain math functions, e.g. tan(-1e20) becomes -0.933 instead of 0.8446.
178+
// For device library functions in bitcode to work, 'Strict' or 'Standard'
179+
// FPOpFusion options in backends is needed. Therefore 'fast-honor-pragmas'
180+
// FP contract option is used to allow fuse across statements in frontend
181+
// whereas respecting contract flag in backend.
182+
Opts.setDefaultFPContractMode(LangOptions::FPM_FastHonorPragmas);
183+
} else if (Opts.CUDA) {
184+
if (T.isSPIRV()) {
185+
// Emit OpenCL version metadata in LLVM IR when targeting SPIR-V.
186+
Opts.OpenCLVersion = 200;
187+
}
188+
// Allow fuse across statements disregarding pragmas.
189+
Opts.setDefaultFPContractMode(LangOptions::FPM_Fast);
190+
}
191+
192+
Opts.RenderScript = Lang == Language::RenderScript;
193+
194+
// OpenCL, C++ and C2x have bool, true, false keywords.
195+
Opts.Bool = Opts.OpenCL || Opts.CPlusPlus || Opts.C2x;
196+
197+
// OpenCL has half keyword
198+
Opts.Half = Opts.OpenCL;
199+
}
200+
81201
FPOptions FPOptions::defaultWithoutTrailingStorage(const LangOptions &LO) {
82202
FPOptions result(LO);
83203
return result;

clang/lib/Basic/LangStandards.cpp

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "clang/Basic/LangStandard.h"
1010
#include "llvm/ADT/StringSwitch.h"
11+
#include "llvm/ADT/Triple.h"
1112
#include "llvm/Support/ErrorHandling.h"
1213
using namespace clang;
1314

@@ -42,4 +43,47 @@ const LangStandard *LangStandard::getLangStandardForName(StringRef Name) {
4243
return &getLangStandardForKind(K);
4344
}
4445

45-
46+
LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang,
47+
const llvm::Triple &T) {
48+
switch (Lang) {
49+
case Language::Unknown:
50+
case Language::LLVM_IR:
51+
llvm_unreachable("Invalid input kind!");
52+
case Language::OpenCL:
53+
return LangStandard::lang_opencl12;
54+
case Language::OpenCLCXX:
55+
return LangStandard::lang_openclcpp10;
56+
case Language::CUDA:
57+
return LangStandard::lang_cuda;
58+
case Language::Asm:
59+
case Language::C:
60+
#if defined(CLANG_DEFAULT_STD_C)
61+
return CLANG_DEFAULT_STD_C;
62+
#else
63+
// The PS4 uses C99 as the default C standard.
64+
if (T.isPS4())
65+
return LangStandard::lang_gnu99;
66+
return LangStandard::lang_gnu17;
67+
#endif
68+
case Language::ObjC:
69+
#if defined(CLANG_DEFAULT_STD_C)
70+
return CLANG_DEFAULT_STD_C;
71+
#else
72+
return LangStandard::lang_gnu11;
73+
#endif
74+
case Language::CXX:
75+
case Language::ObjCXX:
76+
#if defined(CLANG_DEFAULT_STD_CXX)
77+
return CLANG_DEFAULT_STD_CXX;
78+
#else
79+
return LangStandard::lang_gnucxx14;
80+
#endif
81+
case Language::RenderScript:
82+
return LangStandard::lang_c99;
83+
case Language::HIP:
84+
return LangStandard::lang_hip;
85+
case Language::HLSL:
86+
return LangStandard::lang_hlsl2021;
87+
}
88+
llvm_unreachable("unhandled Language kind!");
89+
}

0 commit comments

Comments
 (0)