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, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits