[clang] fb2aa63 - [clang][cli] NFC: Move conditional LangOptions parsing/generation
Jan Svoboda via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 19 02:25:45 PDT 2021
Author: Jan Svoboda
Date: 2021-04-19T11:25:40+02:00
New Revision: fb2aa63d7dc54800d8a08df198e261a95bcefdbe
URL: https://github.com/llvm/llvm-project/commit/fb2aa63d7dc54800d8a08df198e261a95bcefdbe
DIFF: https://github.com/llvm/llvm-project/commit/fb2aa63d7dc54800d8a08df198e261a95bcefdbe.diff
LOG: [clang][cli] NFC: Move conditional LangOptions parsing/generation
NFC, this simplifies the main parsing/generating functions by moving logic around conditional `LangOptions` where it belongs.
Reviewed By: Bigcheese
Differential Revision: https://reviews.llvm.org/D100653
Added:
Modified:
clang/include/clang/Frontend/CompilerInvocation.h
clang/lib/Frontend/CompilerInvocation.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h
index 367efc5ad646..2245439d0632 100644
--- a/clang/include/clang/Frontend/CompilerInvocation.h
+++ b/clang/include/clang/Frontend/CompilerInvocation.h
@@ -262,7 +262,8 @@ class CompilerInvocation : public CompilerInvocationRefBase,
/// Generate command line options from LangOptions.
static void GenerateLangArgs(const LangOptions &Opts,
SmallVectorImpl<const char *> &Args,
- StringAllocator SA, const llvm::Triple &T);
+ StringAllocator SA, const llvm::Triple &T,
+ InputKind IK);
/// Parse command line options that map to CodeGenOptions.
static bool ParseCodeGenArgs(CodeGenOptions &Opts, llvm::opt::ArgList &Args,
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 6679dba364bf..36d2fe379528 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -3278,7 +3278,21 @@ static const StringRef GetInputKindName(InputKind IK) {
void CompilerInvocation::GenerateLangArgs(const LangOptions &Opts,
SmallVectorImpl<const char *> &Args,
StringAllocator SA,
- const llvm::Triple &T) {
+ const llvm::Triple &T, InputKind IK) {
+ if (IK.getFormat() == InputKind::Precompiled ||
+ IK.getLanguage() == Language::LLVM_IR) {
+ if (Opts.ObjCAutoRefCount)
+ GenerateArg(Args, OPT_fobjc_arc, SA);
+ if (Opts.PICLevel != 0)
+ GenerateArg(Args, OPT_pic_level, Twine(Opts.PICLevel), SA);
+ if (Opts.PIE)
+ GenerateArg(Args, OPT_pic_is_pie, SA);
+ for (StringRef Sanitizer : serializeSanitizerKinds(Opts.Sanitize))
+ GenerateArg(Args, OPT_fsanitize_EQ, Sanitizer, SA);
+
+ return;
+ }
+
OptSpecifier StdOpt;
switch (Opts.LangStd) {
case LangStandard::lang_opencl10:
@@ -3500,6 +3514,26 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
DiagnosticsEngine &Diags) {
unsigned NumErrorsBefore = Diags.getNumErrors();
+ if (IK.getFormat() == InputKind::Precompiled ||
+ IK.getLanguage() == Language::LLVM_IR) {
+ // ObjCAAutoRefCount and Sanitize LangOpts are used to setup the
+ // PassManager in BackendUtil.cpp. They need to be initialized no matter
+ // what the input type is.
+ if (Args.hasArg(OPT_fobjc_arc))
+ Opts.ObjCAutoRefCount = 1;
+ // PICLevel and PIELevel are needed during code generation and this should
+ // be set regardless of the input type.
+ Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
+ Opts.PIE = Args.hasArg(OPT_pic_is_pie);
+ parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ),
+ Diags, Opts.Sanitize);
+
+ return Diags.getNumErrors() == NumErrorsBefore;
+ }
+
+ // Other LangOpts are only initialized when the input is not AST or LLVM IR.
+ // FIXME: Should we really be parsing this for an Language::Asm input?
+
// FIXME: Cleanup per-file based stuff.
LangStandard::Kind LangStd = LangStandard::lang_unspecified;
if (const Arg *A = Args.getLastArg(OPT_std_EQ)) {
@@ -4303,27 +4337,11 @@ bool CompilerInvocation::CreateFromArgsImpl(
llvm::Triple T(Res.getTargetOpts().Triple);
ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags,
Res.getFileSystemOpts().WorkingDir);
- if (DashX.getFormat() == InputKind::Precompiled ||
- DashX.getLanguage() == Language::LLVM_IR) {
- // ObjCAAutoRefCount and Sanitize LangOpts are used to setup the
- // PassManager in BackendUtil.cpp. They need to be initializd no matter
- // what the input type is.
- if (Args.hasArg(OPT_fobjc_arc))
- LangOpts.ObjCAutoRefCount = 1;
- // PIClevel and PIELevel are needed during code generation and this should be
- // set regardless of the input type.
- LangOpts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
- LangOpts.PIE = Args.hasArg(OPT_pic_is_pie);
- parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ),
- Diags, LangOpts.Sanitize);
- } else {
- // Other LangOpts are only initialized when the input is not AST or LLVM IR.
- // FIXME: Should we really be calling this for an Language::Asm input?
- ParseLangArgs(LangOpts, Args, DashX, T, Res.getPreprocessorOpts().Includes,
- Diags);
- if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC)
- LangOpts.ObjCExceptions = 1;
- }
+
+ ParseLangArgs(LangOpts, Args, DashX, T, Res.getPreprocessorOpts().Includes,
+ Diags);
+ if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC)
+ LangOpts.ObjCExceptions = 1;
if (LangOpts.CUDA) {
// During CUDA device-side compilation, the aux triple is the
@@ -4517,24 +4535,7 @@ void CompilerInvocation::generateCC1CommandLine(
GenerateFrontendArgs(FrontendOpts, Args, SA, LangOpts->IsHeaderFile);
GenerateTargetArgs(*TargetOpts, Args, SA);
GenerateHeaderSearchArgs(*HeaderSearchOpts, Args, SA);
-
- InputKind DashX = FrontendOpts.DashX;
- if (DashX.getFormat() == InputKind::Precompiled ||
- DashX.getLanguage() == Language::LLVM_IR) {
- if (LangOpts->ObjCAutoRefCount)
- GenerateArg(Args, OPT_fobjc_arc, SA);
- if (LangOpts->PICLevel != 0)
- GenerateArg(Args, OPT_pic_level, Twine(LangOpts->PICLevel), SA);
- if (LangOpts->PIE)
- GenerateArg(Args, OPT_pic_is_pie, SA);
- for (StringRef Sanitizer : serializeSanitizerKinds(LangOpts->Sanitize))
- GenerateArg(Args, OPT_fsanitize_EQ, Sanitizer, SA);
- } else {
- // FIXME: Move this whole condition into GenerateLangArgs. (And do the same
- // for ParseLangArgs).
- GenerateLangArgs(*LangOpts, Args, SA, T);
- }
-
+ GenerateLangArgs(*LangOpts, Args, SA, T, FrontendOpts.DashX);
GenerateCodeGenArgs(CodeGenOpts, Args, SA, T, FrontendOpts.OutputFile,
&*LangOpts);
GeneratePreprocessorArgs(*PreprocessorOpts, Args, SA, *LangOpts, FrontendOpts,
More information about the cfe-commits
mailing list