Skip to content

Commit e2b3b78

Browse files
committed
Merge from 'main' to 'sycl-web' (#5)
CONFLICT (content): Merge conflict in clang/lib/Frontend/CompilerInvocation.cpp
2 parents 8f9ab20 + b6ba598 commit e2b3b78

File tree

17 files changed

+243
-100
lines changed

17 files changed

+243
-100
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 58 additions & 26 deletions
Large diffs are not rendered by default.

clang/lib/AST/ASTImporter.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5399,16 +5399,16 @@ ExpectedDecl ASTNodeImporter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
53995399

54005400
CXXRecordDecl *FromTemplated = D->getTemplatedDecl();
54015401

5402+
auto TemplateParamsOrErr = import(D->getTemplateParameters());
5403+
if (!TemplateParamsOrErr)
5404+
return TemplateParamsOrErr.takeError();
5405+
54025406
// Create the declaration that is being templated.
54035407
CXXRecordDecl *ToTemplated;
54045408
if (Error Err = importInto(ToTemplated, FromTemplated))
54055409
return std::move(Err);
54065410

54075411
// Create the class template declaration itself.
5408-
auto TemplateParamsOrErr = import(D->getTemplateParameters());
5409-
if (!TemplateParamsOrErr)
5410-
return TemplateParamsOrErr.takeError();
5411-
54125412
ClassTemplateDecl *D2;
54135413
if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, Loc, Name,
54145414
*TemplateParamsOrErr, ToTemplated))

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,22 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
2828
const InputInfo &Output, const InputInfoList &Inputs,
2929
const ArgList &Args, const char *LinkingOutput) const {
3030
const auto &TC = getToolChain();
31-
const llvm::Triple &Triple = TC.getEffectiveTriple();
32-
const std::string &TripleStr = Triple.getTriple();
31+
// TODO: Once code-generation is available, this will need to be commented
32+
// out.
33+
// const llvm::Triple &Triple = TC.getEffectiveTriple();
34+
// const std::string &TripleStr = Triple.getTriple();
3335

3436
ArgStringList CmdArgs;
3537

38+
// Invoke ourselves in -fc1 mode.
3639
CmdArgs.push_back("-fc1");
3740

38-
// TODO: Eventually all actions will require a triple (e.g. `-triple
39-
// aarch64-unknown-linux-gnu`). However, `-triple` is currently not supported
40-
// by `flang-new -fc1`, so we only add it selectively to actions that we
41-
// don't support/execute just yet.
41+
// TODO: Once code-generation is available, this will need to be commented
42+
// out.
43+
// Add the "effective" target triple.
44+
// CmdArgs.push_back("-triple");
45+
// CmdArgs.push_back(Args.MakeArgString(TripleStr));
46+
4247
if (isa<PreprocessJobAction>(JA)) {
4348
if (C.getArgs().hasArg(options::OPT_test_io))
4449
CmdArgs.push_back("-test-io");
@@ -61,8 +66,6 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
6166
assert(false && "Unexpected output type!");
6267
}
6368
} else if (isa<AssembleJobAction>(JA)) {
64-
CmdArgs.push_back("-triple");
65-
CmdArgs.push_back(Args.MakeArgString(TripleStr));
6669
CmdArgs.push_back("-emit-obj");
6770
} else {
6871
assert(false && "Unexpected action class for Flang tool.");

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 23 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -328,8 +328,29 @@ static void denormalizeStringVector(SmallVectorImpl<const char *> &Args,
328328
Option::OptionClass OptClass,
329329
unsigned TableIndex,
330330
const std::vector<std::string> &Values) {
331-
for (const std::string &Value : Values) {
332-
denormalizeString(Args, Spelling, SA, OptClass, TableIndex, Value);
331+
switch (OptClass) {
332+
case Option::CommaJoinedClass: {
333+
std::string CommaJoinedValue;
334+
if (!Values.empty()) {
335+
CommaJoinedValue.append(Values.front());
336+
for (const std::string &Value : llvm::drop_begin(Values, 1)) {
337+
CommaJoinedValue.append(",");
338+
CommaJoinedValue.append(Value);
339+
}
340+
}
341+
denormalizeString(Args, Spelling, SA, Option::OptionClass::JoinedClass,
342+
TableIndex, CommaJoinedValue);
343+
break;
344+
}
345+
case Option::JoinedClass:
346+
case Option::SeparateClass:
347+
case Option::JoinedOrSeparateClass:
348+
for (const std::string &Value : Values)
349+
denormalizeString(Args, Spelling, SA, OptClass, TableIndex, Value);
350+
break;
351+
default:
352+
llvm_unreachable("Cannot denormalize an option with option class "
353+
"incompatible with string vector denormalization.");
333354
}
334355
}
335356

@@ -786,7 +807,6 @@ static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts,
786807
}
787808

788809
static void ParseCommentArgs(CommentOptions &Opts, ArgList &Args) {
789-
Opts.BlockCommandNames = Args.getAllArgValues(OPT_fcomment_block_commands);
790810
Opts.ParseAllComments = Args.hasArg(OPT_fparse_all_comments);
791811
}
792812

@@ -991,8 +1011,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
9911011
}
9921012
}
9931013

994-
Opts.Reciprocals = Args.getAllArgValues(OPT_mrecip_EQ);
995-
9961014
// Basic Block Sections implies Function Sections.
9971015
Opts.FunctionSections =
9981016
Args.hasArg(OPT_ffunction_sections) ||
@@ -1122,10 +1140,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
11221140
}
11231141
Opts.LinkBitcodeFiles.push_back(F);
11241142
}
1125-
Opts.SanitizeCoverageAllowlistFiles =
1126-
Args.getAllArgValues(OPT_fsanitize_coverage_allowlist);
1127-
Opts.SanitizeCoverageBlocklistFiles =
1128-
Args.getAllArgValues(OPT_fsanitize_coverage_blocklist);
11291143
Opts.SSPBufferSize =
11301144
getLastArgIntValue(Args, OPT_stack_protector_buffer_size, 8, Diags);
11311145

@@ -1207,8 +1221,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
12071221
}
12081222
}
12091223

1210-
Opts.DependentLibraries = Args.getAllArgValues(OPT_dependent_lib);
1211-
Opts.LinkerOptions = Args.getAllArgValues(OPT_linker_option);
12121224
bool NeedLocTracking = false;
12131225

12141226
if (!Opts.OptRecordFile.empty())
@@ -1282,8 +1294,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
12821294
if (NeedLocTracking && Opts.getDebugInfo() == codegenoptions::NoDebugInfo)
12831295
Opts.setDebugInfo(codegenoptions::LocTrackingOnly);
12841296

1285-
Opts.RewriteMapFiles = Args.getAllArgValues(OPT_frewrite_map_file);
1286-
12871297
// Parse -fsanitize-recover= arguments.
12881298
// FIXME: Report unrecoverable sanitizers incorrectly specified here.
12891299
parseSanitizerKinds("-fsanitize-recover=",
@@ -1295,10 +1305,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
12951305

12961306
Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn, true);
12971307

1298-
Opts.DefaultFunctionAttrs = Args.getAllArgValues(OPT_default_function_attr);
1299-
1300-
Opts.PassPlugins = Args.getAllArgValues(OPT_fpass_plugin_EQ);
1301-
13021308
return Success;
13031309
}
13041310

@@ -1484,7 +1490,6 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
14841490
Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits);
14851491
Opts.ShowPresumedLoc = !Args.hasArg(OPT_fno_diagnostics_use_presumed_location);
14861492
Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
1487-
Opts.VerifyPrefixes = Args.getAllArgValues(OPT_verify_EQ);
14881493
if (Args.hasArg(OPT_verify))
14891494
Opts.VerifyPrefixes.push_back("expected");
14901495
// Keep VerifyPrefixes in its original order for the sake of diagnostics, and
@@ -1531,8 +1536,6 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
15311536
Opts.MessageLength =
15321537
getLastArgIntValue(Args, OPT_fmessage_length_EQ, 0, Diags);
15331538

1534-
Opts.UndefPrefixes = Args.getAllArgValues(OPT_Wundef_prefix_EQ);
1535-
15361539
addDiagnosticArgs(Args, OPT_W_Group, OPT_W_value_Group, Opts.Warnings);
15371540
addDiagnosticArgs(Args, OPT_R_Group, OPT_R_value_Group, Opts.Remarks);
15381541

@@ -1729,8 +1732,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
17291732
}
17301733

17311734
Opts.Plugins = Args.getAllArgValues(OPT_load);
1732-
Opts.ASTMergeFiles = Args.getAllArgValues(OPT_ast_merge);
1733-
Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm);
17341735
Opts.ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
17351736
Opts.ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
17361737
// Only the -fmodule-file=<file> form.
@@ -1739,7 +1740,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
17391740
if (Val.find('=') == StringRef::npos)
17401741
Opts.ModuleFiles.push_back(std::string(Val));
17411742
}
1742-
Opts.ModulesEmbedFiles = Args.getAllArgValues(OPT_fmodules_embed_file_EQ);
17431743
Opts.AllowPCMWithCompilerErrors = Args.hasArg(OPT_fallow_pcm_with_errors);
17441744

17451745
if (Opts.ProgramAction != frontend::GenerateModule && Opts.IsSystemModule)
@@ -2574,7 +2574,6 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
25742574
|| Args.hasArg(OPT_fdump_record_layouts);
25752575
if (Opts.FastRelaxedMath)
25762576
Opts.setDefaultFPContractMode(LangOptions::FPM_Fast);
2577-
Opts.ModuleFeatures = Args.getAllArgValues(OPT_fmodule_feature);
25782577
llvm::sort(Opts.ModuleFeatures);
25792578
Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);
25802579
Opts.NativeHalfArgsAndReturns |= Args.hasArg(OPT_fnative_half_arguments_and_returns);
@@ -2782,20 +2781,12 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
27822781
// Parse -fsanitize= arguments.
27832782
parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ),
27842783
Diags, Opts.Sanitize);
2785-
Opts.SanitizerBlacklistFiles = Args.getAllArgValues(OPT_fsanitize_blacklist);
27862784
std::vector<std::string> systemBlacklists =
27872785
Args.getAllArgValues(OPT_fsanitize_system_blacklist);
27882786
Opts.SanitizerBlacklistFiles.insert(Opts.SanitizerBlacklistFiles.end(),
27892787
systemBlacklists.begin(),
27902788
systemBlacklists.end());
27912789

2792-
// -fxray-{always,never}-instrument= filenames.
2793-
Opts.XRayAlwaysInstrumentFiles =
2794-
Args.getAllArgValues(OPT_fxray_always_instrument);
2795-
Opts.XRayNeverInstrumentFiles =
2796-
Args.getAllArgValues(OPT_fxray_never_instrument);
2797-
Opts.XRayAttrListFiles = Args.getAllArgValues(OPT_fxray_attr_list);
2798-
27992790
if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
28002791
Opts.setClangABICompat(LangOptions::ClangABI::Latest);
28012792

@@ -2970,8 +2961,6 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
29702961
Opts.addMacroUndef(A->getValue());
29712962
}
29722963

2973-
Opts.MacroIncludes = Args.getAllArgValues(OPT_imacros);
2974-
29752964
// Add the ordered list of -includes.
29762965
for (const auto *A : Args.filtered(OPT_include))
29772966
Opts.Includes.emplace_back(A->getValue());
@@ -3010,8 +2999,6 @@ static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,
30102999

30113000
static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args,
30123001
DiagnosticsEngine &Diags) {
3013-
Opts.FeaturesAsWritten = Args.getAllArgValues(OPT_target_feature);
3014-
Opts.OpenCLExtensionsAsWritten = Args.getAllArgValues(OPT_cl_ext_EQ);
30153002
Opts.AllowAMDGPUUnsafeFPAtomics =
30163003
Args.hasFlag(options::OPT_munsafe_fp_atomics,
30173004
options::OPT_mno_unsafe_fp_atomics, false);

clang/unittests/AST/ASTImporterTest.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6141,6 +6141,41 @@ TEST_P(ASTImporterOptionSpecificTestBase, TypedefWithAttribute) {
61416141
EXPECT_EQ(ToAttr->getAnnotation(), "A");
61426142
}
61436143

6144+
TEST_P(ASTImporterOptionSpecificTestBase,
6145+
ImportOfTemplatedDeclWhenPreviousDeclHasNoDescribedTemplateSet) {
6146+
Decl *FromTU = getTuDecl(
6147+
R"(
6148+
6149+
namespace std {
6150+
template<typename T>
6151+
class basic_stringbuf;
6152+
}
6153+
namespace std {
6154+
class char_traits;
6155+
template<typename T = char_traits>
6156+
class basic_stringbuf;
6157+
}
6158+
namespace std {
6159+
template<typename T>
6160+
class basic_stringbuf {};
6161+
}
6162+
6163+
)",
6164+
Lang_CXX11);
6165+
6166+
auto *From1 = FirstDeclMatcher<ClassTemplateDecl>().match(
6167+
FromTU,
6168+
classTemplateDecl(hasName("basic_stringbuf"), unless(isImplicit())));
6169+
auto *To1 = cast_or_null<ClassTemplateDecl>(Import(From1, Lang_CXX11));
6170+
EXPECT_TRUE(To1);
6171+
6172+
auto *From2 = LastDeclMatcher<ClassTemplateDecl>().match(
6173+
FromTU,
6174+
classTemplateDecl(hasName("basic_stringbuf"), unless(isImplicit())));
6175+
auto *To2 = cast_or_null<ClassTemplateDecl>(Import(From2, Lang_CXX11));
6176+
EXPECT_TRUE(To2);
6177+
}
6178+
61446179
INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,
61456180
DefaultTestValuesForRunOptions, );
61466181

clang/unittests/Frontend/CompilerInvocationTest.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,53 @@ TEST_F(CommandLineTest, StringVectorMultiple) {
508508
ASSERT_THAT(GeneratedArgs, ContainsN(HasSubstr("-fmodule-map-file"), 2));
509509
}
510510

511+
// CommaJoined option with MarshallingInfoStringVector.
512+
513+
TEST_F(CommandLineTest, StringVectorCommaJoinedNone) {
514+
const char *Args[] = {""};
515+
516+
CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags);
517+
518+
ASSERT_FALSE(Diags->hasErrorOccurred());
519+
ASSERT_TRUE(Invocation.getLangOpts()->CommentOpts.BlockCommandNames.empty());
520+
521+
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
522+
523+
ASSERT_THAT(GeneratedArgs,
524+
Not(Contains(HasSubstr("-fcomment-block-commands"))));
525+
}
526+
527+
TEST_F(CommandLineTest, StringVectorCommaJoinedSingle) {
528+
const char *Args[] = {"-fcomment-block-commands=x,y"};
529+
530+
CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags);
531+
532+
ASSERT_FALSE(Diags->hasErrorOccurred());
533+
ASSERT_EQ(Invocation.getLangOpts()->CommentOpts.BlockCommandNames,
534+
std::vector<std::string>({"x", "y"}));
535+
536+
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
537+
538+
ASSERT_THAT(GeneratedArgs,
539+
ContainsN(StrEq("-fcomment-block-commands=x,y"), 1));
540+
}
541+
542+
TEST_F(CommandLineTest, StringVectorCommaJoinedMultiple) {
543+
const char *Args[] = {"-fcomment-block-commands=x,y",
544+
"-fcomment-block-commands=a,b"};
545+
546+
CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags);
547+
548+
ASSERT_FALSE(Diags->hasErrorOccurred());
549+
ASSERT_EQ(Invocation.getLangOpts()->CommentOpts.BlockCommandNames,
550+
std::vector<std::string>({"x", "y", "a", "b"}));
551+
552+
Invocation.generateCC1CommandLine(GeneratedArgs, *this);
553+
554+
ASSERT_THAT(GeneratedArgs,
555+
ContainsN(StrEq("-fcomment-block-commands=x,y,a,b"), 1));
556+
}
557+
511558
// A flag that should be parsed only if a condition is met.
512559

513560
TEST_F(CommandLineTest, ConditionalParsingIfFalseFlagNotPresent) {

flang/include/flang/Frontend/FrontendActions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ class ParseSyntaxOnlyAction : public FrontendAction {
2929
void ExecuteAction() override;
3030
};
3131

32+
class EmitObjAction : public FrontendAction {
33+
void ExecuteAction() override;
34+
};
35+
3236
} // namespace Fortran::frontend
3337

3438
#endif // LLVM_FLANG_FRONTEND_FRONTENDACTIONS_H

flang/include/flang/Frontend/FrontendOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ enum ActionKind {
2828
/// -fsyntax-only
2929
ParseSyntaxOnly,
3030

31+
/// Emit a .o file.
32+
EmitObj,
33+
3134
/// TODO: RunPreprocessor, EmitLLVM, EmitLLVMOnly,
3235
/// EmitCodeGenOnly, EmitAssembly, (...)
3336
};

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,11 @@ static InputKind ParseFrontendArgs(FrontendOptions &opts,
9999
case clang::driver::options::OPT_fsyntax_only:
100100
opts.programAction_ = ParseSyntaxOnly;
101101
break;
102+
case clang::driver::options::OPT_emit_obj:
103+
opts.programAction_ = EmitObj;
104+
break;
102105

103106
// TODO:
104-
// case clang::driver::options::OPT_emit_obj:
105107
// case calng::driver::options::OPT_emit_llvm:
106108
// case clang::driver::options::OPT_emit_llvm_only:
107109
// case clang::driver::options::OPT_emit_codegen_only:

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,10 @@ void ParseSyntaxOnlyAction::ExecuteAction() {
111111
ci.diagnostics().Report(DiagID) << GetCurrentFileOrBufferName();
112112
}
113113
}
114+
115+
void EmitObjAction::ExecuteAction() {
116+
CompilerInstance &ci = this->instance();
117+
unsigned DiagID = ci.diagnostics().getCustomDiagID(
118+
clang::DiagnosticsEngine::Error, "code-generation is not available yet");
119+
ci.diagnostics().Report(DiagID);
120+
}

flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ static std::unique_ptr<FrontendAction> CreateFrontendBaseAction(
3434
break;
3535
case ParseSyntaxOnly:
3636
return std::make_unique<ParseSyntaxOnlyAction>();
37+
case EmitObj:
38+
return std::make_unique<EmitObjAction>();
3739
break;
3840
default:
3941
break;

flang/test/Flang-Driver/code-gen.f90

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
! RUN: not %flang-new %s 2>&1 | FileCheck %s --check-prefix=ERROR
2+
! RUN: not %flang-new -c %s 2>&1 | FileCheck %s --check-prefix=ERROR
3+
! RUN: not %flang-new -emit-obj %s 2>&1 | FileCheck %s --check-prefix=ERROR
4+
! RUN: not %flang-new -fc1 -emit-obj %s 2>&1 | FileCheck %s --check-prefix=ERROR
5+
6+
! REQUIRES: new-flang-driver
7+
8+
! Although code-generation is not yet available, we do have frontend actions
9+
! that correspond to `-c` and `-emit-obj`. For now these actions are just a
10+
! placeholder and running them leads to a driver error. This test makes sure
11+
! that these actions are indeed run (rather than `-c` or `-emit-obj` being
12+
! rejected earlier).
13+
! TODO: Replace this file with a proper test once code-generation is available.
14+
15+
! ERROR: code-generation is not available yet

0 commit comments

Comments
 (0)