Skip to content

Commit dde4dea

Browse files
committed
Merge from 'main' to 'sycl-web' (26 commits)
CONFLICT (content): Merge conflict in clang/lib/Driver/Driver.cpp
2 parents a1e9b5e + 4c4ff00 commit dde4dea

File tree

89 files changed

+4058
-3075
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+4058
-3075
lines changed

clang/docs/ClangCommandLineReference.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,14 @@ Validate the system headers that a module depends on when loading the module
11761176

11771177
Specify the prebuilt module path
11781178

1179+
.. option:: -fmodule-header
1180+
1181+
Build a C++20 header unit from a header specified.
1182+
1183+
.. option:: -fmodule-header=\[user,system\]
1184+
1185+
Build a C++20 header unit, but search for the header in the user or system header search paths respectively.
1186+
11791187
.. option:: --hip-path=<arg>
11801188

11811189
HIP runtime installation path, used for finding HIP version and adding HIP include path.

clang/include/clang/AST/TemplateName.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -439,13 +439,6 @@ class QualifiedTemplateName : public llvm::FoldingSetNode {
439439
/// Return the underlying template name.
440440
TemplateName getUnderlyingTemplate() const { return UnderlyingTemplate; }
441441

442-
/// The template declaration to which this qualified name
443-
/// refers.
444-
/// FIXME: remove this and use getUnderlyingTemplate() instead.
445-
TemplateDecl *getTemplateDecl() const {
446-
return UnderlyingTemplate.getAsTemplateDecl();
447-
}
448-
449442
void Profile(llvm::FoldingSetNodeID &ID) {
450443
Profile(ID, getQualifier(), hasTemplateKeyword(), UnderlyingTemplate);
451444
}

clang/include/clang/Driver/Driver.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,16 @@ enum LTOKind {
5656
LTOK_Unknown
5757
};
5858

59+
/// Whether headers used to construct C++20 module units should be looked
60+
/// up by the path supplied on the command line, or in the user or system
61+
/// search paths.
62+
enum ModuleHeaderMode {
63+
HeaderMode_None,
64+
HeaderMode_Default,
65+
HeaderMode_User,
66+
HeaderMode_System
67+
};
68+
5969
/// Driver - Encapsulate logic for constructing compilation processes
6070
/// from a set of gcc-driver-like command line arguments.
6171
class Driver {
@@ -84,6 +94,13 @@ class Driver {
8494
EmbedBitcode
8595
} BitcodeEmbed;
8696

97+
/// Header unit mode set by -fmodule-header={user,system}.
98+
ModuleHeaderMode CXX20HeaderType;
99+
100+
/// Set if we should process inputs and jobs with C++20 module
101+
/// interpretation.
102+
bool ModulesModeCXX20;
103+
87104
/// LTO mode selected via -f(no-)?lto(=.*)? options.
88105
LTOKind LTOMode;
89106

@@ -586,6 +603,12 @@ class Driver {
586603
/// ShouldEmitStaticLibrary - Should the linker emit a static library.
587604
bool ShouldEmitStaticLibrary(const llvm::opt::ArgList &Args) const;
588605

606+
/// Returns true if the user has indicated a C++20 header unit mode.
607+
bool hasHeaderMode() const { return CXX20HeaderType != HeaderMode_None; }
608+
609+
/// Get the mode for handling headers as set by fmodule-header{=}.
610+
ModuleHeaderMode getModuleHeaderMode() const { return CXX20HeaderType; }
611+
589612
/// Returns true if we are performing any kind of LTO.
590613
bool isUsingLTO(bool IsOffload = false) const {
591614
return getLTOMode(IsOffload) != LTOK_None;

clang/include/clang/Driver/Options.td

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2322,6 +2322,11 @@ defm implicit_modules : BoolFOption<"implicit-modules",
23222322
NegFlag<SetFalse, [CC1Option]>, PosFlag<SetTrue>, BothFlags<[NoXarchOption,CoreOption]>>;
23232323
def fretain_comments_from_system_headers : Flag<["-"], "fretain-comments-from-system-headers">, Group<f_Group>, Flags<[CC1Option]>,
23242324
MarshallingInfoFlag<LangOpts<"RetainCommentsFromSystemHeaders">>;
2325+
def fmodule_header : Flag <["-"], "fmodule-header">, Group<f_Group>,
2326+
Flags<[NoXarchOption]>, HelpText<"Build a C++20 Header Unit from a header.">;
2327+
def fmodule_header_EQ : Joined<["-"], "fmodule-header=">, Group<f_Group>,
2328+
Flags<[NoXarchOption]>, MetaVarName<"<kind>">,
2329+
HelpText<"Build a C++20 Header Unit from a header that should be found in the user (fmodule-header=user) or system (fmodule-header=system) search path.">;
23252330

23262331
def fno_knr_functions : Flag<["-"], "fno-knr-functions">, Group<f_Group>,
23272332
MarshallingInfoFlag<LangOpts<"DisableKNRFunctions">>,
@@ -4989,16 +4994,21 @@ def target_abi : Separate<["-"], "target-abi">,
49894994
MarshallingInfoString<TargetOpts<"ABI">>;
49904995
def target_sdk_version_EQ : Joined<["-"], "target-sdk-version=">,
49914996
HelpText<"The version of target SDK used for compilation">;
4992-
def darwin_target_variant_triple : Separate<["-"], "darwin-target-variant-triple">,
4993-
HelpText<"Specify the darwin target variant triple">,
4994-
MarshallingInfoString<TargetOpts<"DarwinTargetVariantTriple">>,
4995-
Normalizer<"normalizeTriple">;
49964997
def darwin_target_variant_sdk_version_EQ : Joined<["-"],
49974998
"darwin-target-variant-sdk-version=">,
49984999
HelpText<"The version of darwin target variant SDK used for compilation">;
49995000

50005001
} // let Flags = [CC1Option, CC1AsOption, NoDriverOption]
50015002

5003+
let Flags = [CC1Option, CC1AsOption] in {
5004+
5005+
def darwin_target_variant_triple : Separate<["-"], "darwin-target-variant-triple">,
5006+
HelpText<"Specify the darwin target variant triple">,
5007+
MarshallingInfoString<TargetOpts<"DarwinTargetVariantTriple">>,
5008+
Normalizer<"normalizeTriple">;
5009+
5010+
} // let Flags = [CC1Option, CC1AsOption]
5011+
50025012
//===----------------------------------------------------------------------===//
50035013
// Target Options (cc1 + cc1as + fc1)
50045014
//===----------------------------------------------------------------------===//

clang/include/clang/Driver/ToolChain.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,10 @@ class ToolChain {
737737
return llvm::DenormalMode::getIEEE();
738738
}
739739

740+
virtual Optional<llvm::Triple> getTargetVariantTriple() const {
741+
return llvm::None;
742+
}
743+
740744
// We want to expand the shortened versions of the triples passed in to
741745
// the values used for the bitcode libraries.
742746
static llvm::Triple getOpenMPTriple(StringRef TripleStr) {

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2204,9 +2204,6 @@ void CXXNameMangler::mangleType(TemplateName TN) {
22042204

22052205
switch (TN.getKind()) {
22062206
case TemplateName::QualifiedTemplate:
2207-
TD = TN.getAsQualifiedTemplateName()->getTemplateDecl();
2208-
goto HaveDecl;
2209-
22102207
case TemplateName::UsingTemplate:
22112208
case TemplateName::Template:
22122209
TD = TN.getAsTemplateDecl();

clang/lib/AST/Randstruct.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,14 @@ void randomizeStructureLayoutImpl(const ASTContext &Context,
150150
if (CurrentBitfieldRun)
151151
Buckets.push_back(std::move(CurrentBitfieldRun));
152152

153-
llvm::shuffle(std::begin(Buckets), std::end(Buckets), RNG);
153+
std::shuffle(std::begin(Buckets), std::end(Buckets), RNG);
154154

155155
// Produce the new ordering of the elements from the Buckets.
156156
SmallVector<FieldDecl *, 16> FinalOrder;
157157
for (const std::unique_ptr<Bucket> &B : Buckets) {
158158
llvm::SmallVectorImpl<FieldDecl *> &RandFields = B->fields();
159159
if (!B->isBitfieldRun())
160-
llvm::shuffle(std::begin(RandFields), std::end(RandFields), RNG);
160+
std::shuffle(std::begin(RandFields), std::end(RandFields), RNG);
161161

162162
FinalOrder.insert(FinalOrder.end(), RandFields.begin(), RandFields.end());
163163
}

clang/lib/AST/TemplateName.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ TemplateDecl *TemplateName::getAsTemplateDecl() const {
115115
}
116116

117117
if (QualifiedTemplateName *QTN = getAsQualifiedTemplateName())
118-
return QTN->getTemplateDecl();
118+
return QTN->getUnderlyingTemplate().getAsTemplateDecl();
119119

120120
if (SubstTemplateTemplateParmStorage *sub = getAsSubstTemplateTemplateParm())
121121
return sub->getReplacement().getAsTemplateDecl();
@@ -273,14 +273,15 @@ void TemplateName::print(raw_ostream &OS, const PrintingPolicy &Policy,
273273
if (Qual == Qualified::Fully &&
274274
getDependence() !=
275275
TemplateNameDependenceScope::DependentInstantiation) {
276-
QTN->getTemplateDecl()->printQualifiedName(OS, Policy);
276+
QTN->getUnderlyingTemplate().getAsTemplateDecl()->printQualifiedName(
277+
OS, Policy);
277278
return;
278279
}
279280
if (Qual == Qualified::AsWritten)
280281
QTN->getQualifier()->print(OS, Policy);
281282
if (QTN->hasTemplateKeyword())
282283
OS << "template ";
283-
OS << *QTN->getTemplateDecl();
284+
OS << *QTN->getUnderlyingTemplate().getAsTemplateDecl();
284285
} else if (DependentTemplateName *DTN = getAsDependentTemplateName()) {
285286
if (Qual == Qualified::AsWritten && DTN->getQualifier())
286287
DTN->getQualifier()->print(OS, Policy);

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3568,7 +3568,11 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
35683568
return getOrCreateRecordFwdDecl(Ty, RDContext);
35693569

35703570
uint64_t Size = CGM.getContext().getTypeSize(Ty);
3571-
auto Align = getDeclAlignIfRequired(D, CGM.getContext());
3571+
// __attribute__((aligned)) can increase or decrease alignment *except* on a
3572+
// struct or struct member, where it only increases alignment unless 'packed'
3573+
// is also specified. To handle this case, the `getTypeAlignIfRequired` needs
3574+
// to be used.
3575+
auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
35723576

35733577
SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);
35743578

clang/lib/Driver/Driver.cpp

Lines changed: 74 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,14 @@ Driver::Driver(StringRef ClangExecutable, StringRef TargetTriple,
193193
DiagnosticsEngine &Diags, std::string Title,
194194
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS)
195195
: Diags(Diags), VFS(std::move(VFS)), Mode(GCCMode),
196-
SaveTemps(SaveTempsNone), BitcodeEmbed(EmbedNone), LTOMode(LTOK_None),
197-
ClangExecutable(ClangExecutable), SysRoot(DEFAULT_SYSROOT),
198-
DriverTitle(Title), CCCPrintBindings(false), CCPrintOptions(false),
199-
CCPrintHeaders(false), CCLogDiagnostics(false), CCGenDiagnostics(false),
200-
CCPrintProcessStats(false), TargetTriple(TargetTriple), Saver(Alloc),
201-
CheckInputsExist(true), GenReproducer(false),
202-
SuppressMissingInputWarning(false) {
196+
SaveTemps(SaveTempsNone), BitcodeEmbed(EmbedNone),
197+
CXX20HeaderType(HeaderMode_None), ModulesModeCXX20(false),
198+
LTOMode(LTOK_None), ClangExecutable(ClangExecutable),
199+
SysRoot(DEFAULT_SYSROOT), DriverTitle(Title), CCCPrintBindings(false),
200+
CCPrintOptions(false), CCPrintHeaders(false), CCLogDiagnostics(false),
201+
CCGenDiagnostics(false), CCPrintProcessStats(false),
202+
TargetTriple(TargetTriple), Saver(Alloc), CheckInputsExist(true),
203+
GenReproducer(false), SuppressMissingInputWarning(false) {
203204
// Provide a sane fallback if no VFS is specified.
204205
if (!this->VFS)
205206
this->VFS = llvm::vfs::getRealFileSystem();
@@ -339,9 +340,13 @@ phases::ID Driver::getFinalPhase(const DerivedArgList &DAL,
339340
CCGenDiagnostics) {
340341
FinalPhase = phases::Preprocess;
341342

342-
// --precompile only runs up to precompilation.
343+
// --precompile only runs up to precompilation.
344+
// Options that cause the output of C++20 compiled module interfaces or
345+
// header units have the same effect.
343346
} else if ((PhaseArg = DAL.getLastArg(options::OPT__precompile)) ||
344-
(PhaseArg = DAL.getLastArg(options::OPT_extract_api))) {
347+
(PhaseArg = DAL.getLastArg(options::OPT_extract_api)) ||
348+
(PhaseArg = DAL.getLastArg(options::OPT_fmodule_header,
349+
options::OPT_fmodule_header_EQ))) {
345350
FinalPhase = phases::Precompile;
346351
// -{fsyntax-only,-analyze,emit-ast} only run up to the compiler.
347352
} else if ((PhaseArg = DAL.getLastArg(options::OPT_fsyntax_only)) ||
@@ -1522,6 +1527,37 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
15221527
BitcodeEmbed = static_cast<BitcodeEmbedMode>(Model);
15231528
}
15241529

1530+
// Setting up the jobs for some precompile cases depends on whether we are
1531+
// treating them as PCH, implicit modules or C++20 ones.
1532+
// TODO: inferring the mode like this seems fragile (it meets the objective
1533+
// of not requiring anything new for operation, however).
1534+
const Arg *Std = Args.getLastArg(options::OPT_std_EQ);
1535+
ModulesModeCXX20 =
1536+
!Args.hasArg(options::OPT_fmodules) && Std &&
1537+
(Std->containsValue("c++20") || Std->containsValue("c++2b") ||
1538+
Std->containsValue("c++2a") || Std->containsValue("c++latest"));
1539+
1540+
// Process -fmodule-header{=} flags.
1541+
if (Arg *A = Args.getLastArg(options::OPT_fmodule_header_EQ,
1542+
options::OPT_fmodule_header)) {
1543+
// These flags force C++20 handling of headers.
1544+
ModulesModeCXX20 = true;
1545+
if (A->getOption().matches(options::OPT_fmodule_header))
1546+
CXX20HeaderType = HeaderMode_Default;
1547+
else {
1548+
StringRef ArgName = A->getValue();
1549+
unsigned Kind = llvm::StringSwitch<unsigned>(ArgName)
1550+
.Case("user", HeaderMode_User)
1551+
.Case("system", HeaderMode_System)
1552+
.Default(~0U);
1553+
if (Kind == ~0U) {
1554+
Diags.Report(diag::err_drv_invalid_value)
1555+
<< A->getAsString(Args) << ArgName;
1556+
} else
1557+
CXX20HeaderType = static_cast<ModuleHeaderMode>(Kind);
1558+
}
1559+
}
1560+
15251561
std::unique_ptr<llvm::opt::InputArgList> UArgs =
15261562
std::make_unique<InputArgList>(std::move(Args));
15271563

@@ -2599,8 +2635,11 @@ bool Driver::DiagnoseInputExistence(const DerivedArgList &Args, StringRef Value,
25992635
return true;
26002636

26012637
// If it's a header to be found in the system or user search path, then defer
2602-
// complaints about its absence until those searches can be done.
2603-
if (Ty == types::TY_CXXSHeader || Ty == types::TY_CXXUHeader)
2638+
// complaints about its absence until those searches can be done. When we
2639+
// are definitely processing headers for C++20 header units, extend this to
2640+
// allow the user to put "-fmodule-header -xc++-header vector" for example.
2641+
if (Ty == types::TY_CXXSHeader || Ty == types::TY_CXXUHeader ||
2642+
(ModulesModeCXX20 && Ty == types::TY_CXXHeader))
26042643
return true;
26052644

26062645
if (getVFS().exists(Value))
@@ -2666,6 +2705,21 @@ bool Driver::DiagnoseInputExistence(const DerivedArgList &Args, StringRef Value,
26662705
return false;
26672706
}
26682707

2708+
// Get the C++20 Header Unit type corresponding to the input type.
2709+
static types::ID CXXHeaderUnitType(ModuleHeaderMode HM) {
2710+
switch (HM) {
2711+
case HeaderMode_User:
2712+
return types::TY_CXXUHeader;
2713+
case HeaderMode_System:
2714+
return types::TY_CXXSHeader;
2715+
case HeaderMode_Default:
2716+
break;
2717+
case HeaderMode_None:
2718+
llvm_unreachable("should not be called in this case");
2719+
}
2720+
return types::TY_CXXHUHeader;
2721+
}
2722+
26692723
// Construct a the list of inputs and their types.
26702724
void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args,
26712725
InputList &Inputs) const {
@@ -2818,6 +2872,11 @@ void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args,
28182872
else if (Args.hasArg(options::OPT_ObjCXX))
28192873
Ty = types::TY_ObjCXX;
28202874
}
2875+
2876+
// Disambiguate headers that are meant to be header units from those
2877+
// intended to be PCH.
2878+
if (Ty == types::TY_CXXHeader && hasHeaderMode())
2879+
Ty = CXXHeaderUnitType(CXX20HeaderType);
28212880
} else {
28222881
assert(InputTypeArg && "InputType set w/o InputTypeArg");
28232882
if (!InputTypeArg->getOption().matches(options::OPT_x)) {
@@ -2875,6 +2934,10 @@ void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args,
28752934
InputType == types::TY_CHeader))
28762935
Diag(clang::diag::err_drv_fsycl_with_c_type) << A->getAsString(Args);
28772936

2937+
// If the user has put -fmodule-header{,=} then we treat C++ headers as
2938+
// header unit inputs. So we 'promote' -xc++-header appropriately.
2939+
if (InputType == types::TY_CXXHeader && hasHeaderMode())
2940+
InputType = CXXHeaderUnitType(CXX20HeaderType);
28782941
} else if (A->getOption().getID() == options::OPT_U) {
28792942
assert(A->getNumValues() == 1 && "The /U option has one value.");
28802943
StringRef Val = A->getValue(0);

0 commit comments

Comments
 (0)