Skip to content

Commit 716677f

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:1e43975652e5 into amd-gfx:0f5dcae1ff2f
Local branch amd-gfx 0f5dcae Merged main:86bb713142c3 into amd-gfx:fd6ee38e1eb7 Remote branch main 1e43975 [TableGen][NFC] Remove MultiClass argument and Scoper in QualifyName (llvm#69297)
2 parents 0f5dcae + 1e43975 commit 716677f

File tree

8 files changed

+128
-48
lines changed

8 files changed

+128
-48
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ C++ Specific Potentially Breaking Changes
121121
system headers and macros. It will be turned into a hard (non-downgradable)
122122
error in the next Clang release.
123123

124+
- The flag `-fdelayed-template-parsing` won't be enabled by default with C++20
125+
when targetting MSVC to match the behavior of MSVC.
126+
(`MSVC Docs <https://learn.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-170>`_)
127+
124128
ABI Changes in This Version
125129
---------------------------
126130
- Following the SystemV ABI for x86-64, ``__int128`` arguments will no longer

clang/include/clang/Basic/DiagnosticDriverKinds.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,10 @@ def err_test_module_file_extension_format : Error<
527527
def err_drv_module_output_with_multiple_arch : Error<
528528
"option '-fmodule-output' can't be used with multiple arch options">;
529529

530+
def warn_drv_delayed_template_parsing_after_cxx20 : Warning<
531+
"-fdelayed-template-parsing is deprecated after C++20">,
532+
InGroup<DiagGroup<"delayed-template-parsing-in-cxx20">>;
533+
530534
def err_drv_extract_api_wrong_kind : Error<
531535
"header file '%0' input '%1' does not match the type of prior input "
532536
"in api extraction; use '-x %2' to override">;

clang/lib/Basic/Targets/RISCV.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ using namespace clang;
2323
using namespace clang::targets;
2424

2525
ArrayRef<const char *> RISCVTargetInfo::getGCCRegNames() const {
26+
// clang-format off
2627
static const char *const GCCRegNames[] = {
2728
// Integer registers
2829
"x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
@@ -40,7 +41,12 @@ ArrayRef<const char *> RISCVTargetInfo::getGCCRegNames() const {
4041
"v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
4142
"v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
4243
"v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
43-
"v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"};
44+
"v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
45+
46+
// CSRs
47+
"fflags", "frm", "vtype", "vl", "vxsat", "vxrm"
48+
};
49+
// clang-format on
4450
return llvm::ArrayRef(GCCRegNames);
4551
}
4652

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3724,20 +3724,10 @@ bool Driver::getDefaultModuleCachePath(SmallVectorImpl<char> &Result) {
37243724

37253725
static bool RenderModulesOptions(Compilation &C, const Driver &D,
37263726
const ArgList &Args, const InputInfo &Input,
3727-
const InputInfo &Output, const Arg *Std,
3727+
const InputInfo &Output, bool HaveStd20,
37283728
ArgStringList &CmdArgs) {
37293729
bool IsCXX = types::isCXX(Input.getType());
3730-
// FIXME: Find a better way to determine whether the input has standard c++
3731-
// modules support by default.
3732-
bool HaveStdCXXModules =
3733-
IsCXX && Std &&
3734-
(Std->containsValue("c++2a") || Std->containsValue("gnu++2a") ||
3735-
Std->containsValue("c++20") || Std->containsValue("gnu++20") ||
3736-
Std->containsValue("c++2b") || Std->containsValue("gnu++2b") ||
3737-
Std->containsValue("c++23") || Std->containsValue("gnu++23") ||
3738-
Std->containsValue("c++2c") || Std->containsValue("gnu++2c") ||
3739-
Std->containsValue("c++26") || Std->containsValue("gnu++26") ||
3740-
Std->containsValue("c++latest") || Std->containsValue("gnu++latest"));
3730+
bool HaveStdCXXModules = IsCXX && HaveStd20;
37413731
bool HaveModules = HaveStdCXXModules;
37423732

37433733
// -fmodules enables the use of precompiled modules (off by default).
@@ -6840,14 +6830,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
68406830
(!IsWindowsMSVC || IsMSVC2015Compatible)))
68416831
CmdArgs.push_back("-fno-threadsafe-statics");
68426832

6843-
// -fno-delayed-template-parsing is default, except when targeting MSVC.
6844-
// Many old Windows SDK versions require this to parse.
6845-
// FIXME: MSVC introduced /Zc:twoPhase- to disable this behavior in their
6846-
// compiler. We should be able to disable this by default at some point.
6847-
if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
6848-
options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
6849-
CmdArgs.push_back("-fdelayed-template-parsing");
6850-
68516833
// -fgnu-keywords default varies depending on language; only pass if
68526834
// specified.
68536835
Args.AddLastArg(CmdArgs, options::OPT_fgnu_keywords,
@@ -6868,8 +6850,38 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
68686850

68696851
Args.AddLastArg(CmdArgs, options::OPT_finline_max_stacksize_EQ);
68706852

6853+
// FIXME: Find a better way to determine whether we are in C++20.
6854+
bool HaveCxx20 =
6855+
Std &&
6856+
(Std->containsValue("c++2a") || Std->containsValue("gnu++2a") ||
6857+
Std->containsValue("c++20") || Std->containsValue("gnu++20") ||
6858+
Std->containsValue("c++2b") || Std->containsValue("gnu++2b") ||
6859+
Std->containsValue("c++23") || Std->containsValue("gnu++23") ||
6860+
Std->containsValue("c++2c") || Std->containsValue("gnu++2c") ||
6861+
Std->containsValue("c++26") || Std->containsValue("gnu++26") ||
6862+
Std->containsValue("c++latest") || Std->containsValue("gnu++latest"));
68716863
bool HaveModules =
6872-
RenderModulesOptions(C, D, Args, Input, Output, Std, CmdArgs);
6864+
RenderModulesOptions(C, D, Args, Input, Output, HaveCxx20, CmdArgs);
6865+
6866+
// -fdelayed-template-parsing is default when targeting MSVC.
6867+
// Many old Windows SDK versions require this to parse.
6868+
//
6869+
// According to
6870+
// https://learn.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=msvc-170,
6871+
// MSVC actually defaults to -fno-delayed-template-parsing (/Zc:twoPhase-
6872+
// with MSVC CLI) if using C++20. So we match the behavior with MSVC here to
6873+
// not enable -fdelayed-template-parsing by default after C++20.
6874+
//
6875+
// FIXME: Given -fdelayed-template-parsing is a source of bugs, we should be
6876+
// able to disable this by default at some point.
6877+
if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
6878+
options::OPT_fno_delayed_template_parsing,
6879+
IsWindowsMSVC && !HaveCxx20)) {
6880+
if (HaveCxx20)
6881+
D.Diag(clang::diag::warn_drv_delayed_template_parsing_after_cxx20);
6882+
6883+
CmdArgs.push_back("-fdelayed-template-parsing");
6884+
}
68736885

68746886
if (Args.hasFlag(options::OPT_fpch_validate_input_files_content,
68756887
options::OPT_fno_pch_validate_input_files_content, false))
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 3
2+
// REQUIRES: riscv-registered-target
3+
// RUN: %clang_cc1 -triple riscv32 -O2 -emit-llvm %s -o - \
4+
// RUN: | FileCheck %s
5+
// RUN: %clang_cc1 -triple riscv64 -O2 -emit-llvm %s -o - \
6+
// RUN: | FileCheck %s
7+
8+
// Test RISC-V specific clobbered registers in inline assembly.
9+
10+
// CHECK-LABEL: define {{.*}} void @test_fflags
11+
// CHECK: tail call void asm sideeffect "", "~{fflags}"()
12+
void test_fflags(void) {
13+
asm volatile ("" :::"fflags");
14+
}
15+
16+
// CHECK-LABEL: define {{.*}} void @test_frm
17+
// CHECK: tail call void asm sideeffect "", "~{frm}"()
18+
void test_frm(void) {
19+
asm volatile ("" :::"frm");
20+
}
21+
22+
// CHECK-LABEL: define {{.*}} void @test_vtype
23+
// CHECK: tail call void asm sideeffect "", "~{vtype}"()
24+
void test_vtype(void) {
25+
asm volatile ("" :::"vtype");
26+
}
27+
28+
// CHECK-LABEL: define {{.*}} void @test_vl
29+
// CHECK: tail call void asm sideeffect "", "~{vl}"()
30+
void test_vl(void) {
31+
asm volatile ("" :::"vl");
32+
}
33+
34+
// CHECK-LABEL: define {{.*}} void @test_vxsat
35+
// CHECK: tail call void asm sideeffect "", "~{vxsat}"()
36+
void test_vxsat(void) {
37+
asm volatile ("" :::"vxsat");
38+
}
39+
40+
// CHECK-LABEL: define {{.*}} void @test_vxrm
41+
// CHECK: tail call void asm sideeffect "", "~{vxrm}"()
42+
void test_vxrm(void) {
43+
asm volatile ("" :::"vxrm");
44+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: %clang_cl -### -- %s 2>&1 | FileCheck %s --check-prefix=PRE-CXX20
2+
// RUN: %clang_cl -std:c++20 -### -- %s 2>&1 | FileCheck %s
3+
// RUN: %clang_cl -std:c++20 -### -fdelayed-template-parsing -- %s 2>&1 | FileCheck %s --check-prefix=CHECK-EXPLICIT
4+
5+
// PRE-CXX20: -fdelayed-template-parsing
6+
7+
// CHECK-NOT: -fdelayed-template-parsing
8+
9+
// CHECK-EXPLICIT: warning: -fdelayed-template-parsing is deprecated after C++20
10+
// CHECK-EXPLICIT: -fdelayed-template-parsing

llvm/include/llvm/Config/llvm-config.h.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
/* Indicate that this is LLVM compiled from the amd-gfx branch. */
1818
#define LLVM_HAVE_BRANCH_AMD_GFX
19-
#define LLVM_MAIN_REVISION 478311
19+
#define LLVM_MAIN_REVISION 478314
2020

2121
/* Define if LLVM_ENABLE_DUMP is enabled */
2222
#cmakedefine LLVM_ENABLE_DUMP

llvm/lib/TableGen/TGParser.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -111,42 +111,43 @@ static void checkConcrete(Record &R) {
111111

112112
/// Return an Init with a qualifier prefix referring
113113
/// to CurRec's name.
114-
static Init *QualifyName(Record &CurRec, MultiClass *CurMultiClass, Init *Name,
115-
StringRef Scoper) {
114+
static Init *QualifyName(Record &CurRec, Init *Name, bool IsMC = false) {
116115
RecordKeeper &RK = CurRec.getRecords();
117-
Init *NewName = BinOpInit::getStrConcat(CurRec.getNameInit(),
118-
StringInit::get(RK, Scoper));
116+
Init *NewName = BinOpInit::getStrConcat(
117+
CurRec.getNameInit(), StringInit::get(RK, IsMC ? "::" : ":"));
119118
NewName = BinOpInit::getStrConcat(NewName, Name);
120119

121120
if (BinOpInit *BinOp = dyn_cast<BinOpInit>(NewName))
122121
NewName = BinOp->Fold(&CurRec);
123122
return NewName;
124123
}
125124

125+
static Init *QualifyName(MultiClass *MC, Init *Name) {
126+
return QualifyName(MC->Rec, Name, /*IsMC=*/true);
127+
}
128+
126129
/// Return the qualified version of the implicit 'NAME' template argument.
127-
static Init *QualifiedNameOfImplicitName(Record &Rec,
128-
MultiClass *MC = nullptr) {
129-
return QualifyName(Rec, MC, StringInit::get(Rec.getRecords(), "NAME"),
130-
MC ? "::" : ":");
130+
static Init *QualifiedNameOfImplicitName(Record &Rec, bool IsMC = false) {
131+
return QualifyName(Rec, StringInit::get(Rec.getRecords(), "NAME"), IsMC);
131132
}
132133

133134
static Init *QualifiedNameOfImplicitName(MultiClass *MC) {
134-
return QualifiedNameOfImplicitName(MC->Rec, MC);
135+
return QualifiedNameOfImplicitName(MC->Rec, /*IsMC=*/true);
135136
}
136137

137-
Init *TGVarScope::getVar(RecordKeeper &Records, MultiClass* ParsingMultiClass,
138+
Init *TGVarScope::getVar(RecordKeeper &Records, MultiClass *ParsingMultiClass,
138139
StringInit *Name, SMRange NameLoc,
139140
bool TrackReferenceLocs) const {
140141
// First, we search in local variables.
141142
auto It = Vars.find(Name->getValue());
142143
if (It != Vars.end())
143144
return It->second;
144145

145-
std::function<Init *(Record *, StringInit *, StringRef)> FindValueInArgs =
146-
[&](Record *Rec, StringInit *Name, StringRef Scoper) -> Init * {
146+
auto FindValueInArgs = [&](Record *Rec, StringInit *Name,
147+
bool IsMC) -> Init * {
147148
if (!Rec)
148149
return nullptr;
149-
Init *ArgName = QualifyName(*Rec, ParsingMultiClass, Name, Scoper);
150+
Init *ArgName = QualifyName(*Rec, Name, IsMC);
150151
if (Rec->isTemplateArg(ArgName)) {
151152
RecordVal *RV = Rec->getValue(ArgName);
152153
assert(RV && "Template arg doesn't exist??");
@@ -176,7 +177,7 @@ Init *TGVarScope::getVar(RecordKeeper &Records, MultiClass* ParsingMultiClass,
176177

177178
// The variable is a class template argument?
178179
if (CurRec->isClass())
179-
if (auto *V = FindValueInArgs(CurRec, Name, ":"))
180+
if (auto *V = FindValueInArgs(CurRec, Name, /*IsMC=*/false))
180181
return V;
181182
}
182183
break;
@@ -193,7 +194,7 @@ Init *TGVarScope::getVar(RecordKeeper &Records, MultiClass* ParsingMultiClass,
193194
case SK_MultiClass: {
194195
// The variable is a multiclass template argument?
195196
if (CurMultiClass)
196-
if (auto *V = FindValueInArgs(&CurMultiClass->Rec, Name, "::"))
197+
if (auto *V = FindValueInArgs(&CurMultiClass->Rec, Name, /*IsMC=*/true))
197198
return V;
198199
break;
199200
}
@@ -3191,8 +3192,7 @@ bool TGParser::ParseTemplateArgValueList(
31913192
"The name of named argument should be a valid identifier");
31923193

31933194
auto *Name = cast<StringInit>(Value);
3194-
Init *QualifiedName =
3195-
QualifyName(*ArgsRec, CurMultiClass, Name, IsDefm ? "::" : ":");
3195+
Init *QualifiedName = QualifyName(*ArgsRec, Name, /*IsMC=*/IsDefm);
31963196
auto *NamedArg = ArgsRec->getValue(QualifiedName);
31973197
if (!NamedArg)
31983198
return Error(ValueLoc,
@@ -3271,17 +3271,17 @@ Init *TGParser::ParseDeclaration(Record *CurRec,
32713271
RecordVal(DeclName, IdLoc, Type,
32723272
HasField ? RecordVal::FK_NonconcreteOK
32733273
: RecordVal::FK_Normal));
3274-
32753274
} else if (CurRec) { // class template argument
3276-
DeclName = QualifyName(*CurRec, CurMultiClass, DeclName, ":");
3277-
BadField = AddValue(CurRec, IdLoc, RecordVal(DeclName, IdLoc, Type,
3278-
RecordVal::FK_TemplateArg));
3279-
3275+
DeclName = QualifyName(*CurRec, DeclName);
3276+
BadField =
3277+
AddValue(CurRec, IdLoc,
3278+
RecordVal(DeclName, IdLoc, Type, RecordVal::FK_TemplateArg));
32803279
} else { // multiclass template argument
32813280
assert(CurMultiClass && "invalid context for template argument");
3282-
DeclName = QualifyName(CurMultiClass->Rec, CurMultiClass, DeclName, "::");
3283-
BadField = AddValue(CurRec, IdLoc, RecordVal(DeclName, IdLoc, Type,
3284-
RecordVal::FK_TemplateArg));
3281+
DeclName = QualifyName(CurMultiClass, DeclName);
3282+
BadField =
3283+
AddValue(CurRec, IdLoc,
3284+
RecordVal(DeclName, IdLoc, Type, RecordVal::FK_TemplateArg));
32853285
}
32863286
if (BadField)
32873287
return nullptr;

0 commit comments

Comments
 (0)