Skip to content

Commit 5a95118

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merge upstream LLVM into amd-gfx12
2 parents be733dd + 115f768 commit 5a95118

File tree

127 files changed

+6242
-5229
lines changed

Some content is hidden

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

127 files changed

+6242
-5229
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,8 @@ Bug Fixes in This Version
814814
- Fixed a failed assertion with an operator call expression which comes from a
815815
macro expansion when performing analysis for nullability attributes. (#GH138371)
816816
- Fixed a concept equivalent checking crash due to untransformed constraint expressions. (#GH146614)
817+
- Fix a crash when marco name is empty in ``#pragma push_macro("")`` or
818+
``#pragma pop_macro("")``. (GH149762).
817819

818820
Bug Fixes to Compiler Builtins
819821
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

clang/include/clang/Basic/DiagnosticLexKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,9 @@ def err_pragma_push_pop_macro_malformed : Error<
694694
def warn_pragma_pop_macro_no_push : Warning<
695695
"pragma pop_macro could not pop '%0', no matching push_macro">,
696696
InGroup<IgnoredPragmas>;
697+
def warn_pargma_push_pop_macro_empty_string : Warning<
698+
"'#pragma %select{push_macro|pop_macro}0' expected a non-empty string">,
699+
InGroup<IgnoredPragmas>;
697700
def warn_pragma_message : Warning<"%0">,
698701
InGroup<PoundPragmaMessage>, DefaultWarnNoWerror;
699702
def err_pragma_message : Error<"%0">;

clang/lib/CodeGen/CGStmt.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2676,6 +2676,9 @@ static void UpdateAsmCallInst(llvm::CallBase &Result, bool HasSideEffect,
26762676
llvm::ConstantAsMetadata::get(Loc)));
26772677
}
26782678

2679+
// Make inline-asm calls Key for the debug info feature Key Instructions.
2680+
CGF.addInstToNewSourceAtom(&Result, nullptr);
2681+
26792682
if (!NoConvergent && CGF.getLangOpts().assumeFunctionsAreConvergent())
26802683
// Conservatively, mark all inline asm blocks in CUDA or OpenCL as
26812684
// convergent (meaning, they may call an intrinsically convergent op, such
@@ -2754,14 +2757,16 @@ EmitAsmStores(CodeGenFunction &CGF, const AsmStmt &S,
27542757
}
27552758
}
27562759

2760+
ApplyAtomGroup Grp(CGF.getDebugInfo());
27572761
LValue Dest = ResultRegDests[i];
27582762
// ResultTypeRequiresCast elements correspond to the first
27592763
// ResultTypeRequiresCast.size() elements of RegResults.
27602764
if ((i < ResultTypeRequiresCast.size()) && ResultTypeRequiresCast[i]) {
27612765
unsigned Size = CGF.getContext().getTypeSize(ResultRegQualTys[i]);
27622766
Address A = Dest.getAddress().withElementType(ResultRegTypes[i]);
27632767
if (CGF.getTargetHooks().isScalarizableAsmOperand(CGF, TruncTy)) {
2764-
Builder.CreateStore(Tmp, A);
2768+
llvm::StoreInst *S = Builder.CreateStore(Tmp, A);
2769+
CGF.addInstToCurrentSourceAtom(S, S->getValueOperand());
27652770
continue;
27662771
}
27672772

clang/lib/Lex/Pragma.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,8 @@ IdentifierInfo *Preprocessor::ParsePragmaPushOrPopMacro(Token &Tok) {
591591
}
592592

593593
// Remember the macro string.
594-
std::string StrVal = getSpelling(Tok);
594+
Token StrTok = Tok;
595+
std::string StrVal = getSpelling(StrTok);
595596

596597
// Read the ')'.
597598
Lex(Tok);
@@ -604,6 +605,15 @@ IdentifierInfo *Preprocessor::ParsePragmaPushOrPopMacro(Token &Tok) {
604605
assert(StrVal[0] == '"' && StrVal[StrVal.size()-1] == '"' &&
605606
"Invalid string token!");
606607

608+
if (StrVal.size() <= 2) {
609+
Diag(StrTok.getLocation(), diag::warn_pargma_push_pop_macro_empty_string)
610+
<< SourceRange(
611+
StrTok.getLocation(),
612+
StrTok.getLocation().getLocWithOffset(StrTok.getLength()))
613+
<< PragmaTok.getIdentifierInfo()->isStr("pop_macro");
614+
return nullptr;
615+
}
616+
607617
// Create a Token from the string.
608618
Token MacroTok;
609619
MacroTok.startToken();
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
// REQUIRES: x86-registered-target
2+
3+
// RUN: %clang_cl -c --target=x86_64-windows-msvc /EHa -O2 /GS- \
4+
// RUN: -Xclang=-import-call-optimization \
5+
// RUN: /clang:-S /clang:-o- -- %s 2>&1 \
6+
// RUN: | FileCheck %s
7+
8+
#ifdef __clang__
9+
#define NO_TAIL __attribute((disable_tail_calls))
10+
#else
11+
#define NO_TAIL
12+
#endif
13+
14+
void might_throw();
15+
void other_func(int x);
16+
17+
void does_not_throw() noexcept(true);
18+
19+
extern "C" void __declspec(dllimport) some_dll_import();
20+
21+
class HasDtor {
22+
int x;
23+
char foo[40];
24+
25+
public:
26+
explicit HasDtor(int x);
27+
~HasDtor();
28+
};
29+
30+
class BadError {
31+
public:
32+
int errorCode;
33+
};
34+
35+
void normal_has_regions() {
36+
// CHECK-LABEL: .def "?normal_has_regions@@YAXXZ"
37+
// CHECK: .seh_endprologue
38+
39+
// <-- state -1 (none)
40+
{
41+
HasDtor hd{42};
42+
43+
// <-- state goes from -1 to 0
44+
// because state changes, we expect the HasDtor::HasDtor() call to have a NOP
45+
// CHECK: call "??0HasDtor@@QEAA@H@Z"
46+
// CHECK-NEXT: nop
47+
48+
might_throw();
49+
// CHECK: call "?might_throw@@YAXXZ"
50+
// CHECK-NEXT: nop
51+
52+
// <-- state goes from 0 to -1 because we're about to call HasDtor::~HasDtor()
53+
// CHECK: call "??1HasDtor@@QEAA@XZ"
54+
// <-- state -1
55+
}
56+
57+
// <-- state -1
58+
other_func(10);
59+
// CHECK: call "?other_func@@YAXH@Z"
60+
// CHECK-NEXT: nop
61+
// CHECK: .seh_startepilogue
62+
63+
// <-- state -1
64+
}
65+
66+
// This tests a tail call to a destructor.
67+
void case_dtor_arg_empty_body(HasDtor x)
68+
{
69+
// CHECK-LABEL: .def "?case_dtor_arg_empty_body@@YAXVHasDtor@@@Z"
70+
// CHECK: jmp "??1HasDtor@@QEAA@XZ"
71+
}
72+
73+
int case_dtor_arg_empty_with_ret(HasDtor x)
74+
{
75+
// CHECK-LABEL: .def "?case_dtor_arg_empty_with_ret@@YAHVHasDtor@@@Z"
76+
// CHECK: .seh_endprologue
77+
78+
// CHECK: call "??1HasDtor@@QEAA@XZ"
79+
// CHECK-NOT: nop
80+
81+
// The call to HasDtor::~HasDtor() should NOT have a NOP because the
82+
// following "mov eax, 100" instruction is in the same EH state.
83+
84+
return 100;
85+
86+
// CHECK: mov eax, 100
87+
// CHECK: .seh_startepilogue
88+
// CHECK: .seh_endepilogue
89+
// CHECK: .seh_endproc
90+
}
91+
92+
int case_noexcept_dtor(HasDtor x) noexcept(true)
93+
{
94+
// CHECK: .def "?case_noexcept_dtor@@YAHVHasDtor@@@Z"
95+
// CHECK: call "??1HasDtor@@QEAA@XZ"
96+
// CHECK-NEXT: mov eax, 100
97+
// CHECK: .seh_startepilogue
98+
return 100;
99+
}
100+
101+
void case_except_simple_call() NO_TAIL
102+
{
103+
does_not_throw();
104+
}
105+
// CHECK-LABEL: .def "?case_except_simple_call@@YAXXZ"
106+
// CHECK: .seh_endprologue
107+
// CHECK-NEXT: call "?does_not_throw@@YAXXZ"
108+
// CHECK-NEXT: nop
109+
// CHECK-NEXT: .seh_startepilogue
110+
// CHECK: .seh_endproc
111+
112+
void case_noexcept_simple_call() noexcept(true) NO_TAIL
113+
{
114+
does_not_throw();
115+
}
116+
// CHECK-LABEL: .def "?case_noexcept_simple_call@@YAXXZ"
117+
// CHECK: .seh_endprologue
118+
// CHECK-NEXT: call "?does_not_throw@@YAXXZ"
119+
// CHECK-NEXT: nop
120+
// CHECK-NEXT: .seh_startepilogue
121+
// CHECK: .seh_endepilogue
122+
// CHECK-NEXT: ret
123+
// CHECK-NEXT: .seh_endproc
124+
125+
// This tests that the destructor is called right before SEH_BeginEpilogue,
126+
// but in a function that has a return value. Loading the return value
127+
// counts as a real instruction, so there is no need for a NOP after the
128+
// dtor call.
129+
int case_dtor_arg_calls_no_throw(HasDtor x)
130+
{
131+
does_not_throw(); // no NOP expected
132+
return 100;
133+
}
134+
// CHECK-LABEL: .def "?case_dtor_arg_calls_no_throw@@YAHVHasDtor@@@Z"
135+
// CHECK: .seh_endprologue
136+
// CHECK: "?does_not_throw@@YAXXZ"
137+
// CHECK-NEXT: nop
138+
// CHECK: "??1HasDtor@@QEAA@XZ"
139+
// CHECK-NEXT: mov eax, 100
140+
// CHECK: .seh_startepilogue
141+
// CHECK: .seh_endproc
142+
143+
// Check the behavior of CALLs that are at the end of MBBs. If a CALL is within
144+
// a non-null EH state (state -1) and is at the end of an MBB, then we expect
145+
// to find an EH_LABEL after the CALL. This causes us to insert a NOP, which
146+
// is the desired result.
147+
void case_dtor_runs_after_join(int x) {
148+
// CHECK-LABEL: .def "?case_dtor_runs_after_join@@YAXH@Z"
149+
// CHECK: .seh_endprologue
150+
151+
// <-- EH state -1
152+
153+
// ctor call does not need a NOP, because it has real instructions after it
154+
HasDtor hd{42};
155+
// CHECK: call "??0HasDtor@@QEAA@H@Z"
156+
// CHECK-NEXT: nop
157+
// CHECK: test
158+
159+
// <-- EH state transition from -1 0
160+
if (x) {
161+
might_throw(); // <-- NOP expected (at end of BB w/ EH_LABEL)
162+
// CHECK: call "?might_throw@@YAXXZ"
163+
// CHECK-NEXT: nop
164+
} else {
165+
other_func(10); // <-- NOP expected (at end of BB w/ EH_LABEL)
166+
// CHECK: call "?other_func@@YAXH@Z"
167+
// CHECK-NEXT: nop
168+
}
169+
does_not_throw();
170+
// <-- EH state transition 0 to -1
171+
// ~HasDtor() runs
172+
173+
// CHECK: .seh_endproc
174+
175+
// CHECK: "$ip2state$?case_dtor_runs_after_join@@YAXH@Z":
176+
// CHECK-NEXT: .long [[func_begin:.Lfunc_begin([0-9]+)@IMGREL]]
177+
// CHECK-NEXT: .long -1
178+
// CHECK-NEXT: .long [[tmp1:.Ltmp([0-9]+)]]@IMGREL
179+
// CHECK-NEXT: .long 0
180+
// CHECK-NEXT: .long [[tmp2:.Ltmp([0-9]+)]]@IMGREL
181+
// CHECK-NEXT: .long -1
182+
}
183+
184+
185+
// Check the behavior of NOP padding around tail calls.
186+
// We do not expect to insert NOPs around tail calls.
187+
// However, the first call (to other_func()) does get a NOP
188+
// because it comes before .seh_startepilogue.
189+
void case_tail_call_no_eh(bool b) {
190+
// tail call; no NOP padding after JMP
191+
if (b) {
192+
does_not_throw();
193+
// <-- no NOP here
194+
return;
195+
}
196+
197+
other_func(20);
198+
// <-- NOP does get inserted here
199+
}
200+
// CHECK-LABEL: .def "?case_tail_call_no_eh@@YAX_N@Z"
201+
// CHECK: test
202+
// CHECK-NEXT: je .LBB
203+
// CHECK: jmp "?does_not_throw@@YAXXZ"
204+
// CHECK-SAME: TAILCALL
205+
// CHECK-NEXT: .LBB
206+
// CHECK-NEXT: mov ecx, 20
207+
// CHECK-NEXT: jmp "?other_func@@YAXH@Z"
208+
// CHECK-SAME: TAILCALL
209+
// CHECK-NEXT: # -- End function

0 commit comments

Comments
 (0)