Skip to content

Commit dcac304

Browse files
committed
merge main into amd-staging
Change-Id: I5398514af75c1bfbf07ff45123145c615a85499c
2 parents c6ce73f + f2a87b0 commit dcac304

File tree

40 files changed

+691
-192
lines changed

40 files changed

+691
-192
lines changed

.github/workflows/issue-write.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
script: |
3232
var fs = require('fs');
3333
const comments = JSON.parse(fs.readFileSync('./comments'));
34-
if (!comments) {
34+
if (!comments || comments.length == 0) {
3535
return;
3636
}
3737
@@ -77,6 +77,15 @@ jobs:
7777
}
7878
const gql_result = await github.graphql(gql_query, gql_variables);
7979
console.log(gql_result);
80+
// If the branch for the PR was deleted before this job has a chance
81+
// to run, then the ref will be null. This can happen if someone:
82+
// 1. Rebase the PR, which triggers some workflow.
83+
// 2. Immediately merges the PR and deletes the branch.
84+
// 3. The workflow finishes and triggers this job.
85+
if (!gql_result.repository.ref) {
86+
console.log("Ref has been deleted");
87+
return;
88+
}
8089
console.log(gql_result.repository.ref.associatedPullRequests.nodes);
8190
8291
var pr_number = 0;

bolt/include/bolt/Core/BinaryFunction.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1168,7 +1168,7 @@ class BinaryFunction {
11681168
/// Pass an offset of the entry point in the input binary and a corresponding
11691169
/// global symbol to the callback function.
11701170
///
1171-
/// Return true of all callbacks returned true, false otherwise.
1171+
/// Return true if all callbacks returned true, false otherwise.
11721172
bool forEachEntryPoint(EntryPointCallbackTy Callback) const;
11731173

11741174
/// Return MC symbol associated with the end of the function.

clang/lib/CodeGen/BackendUtil.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,20 +101,19 @@ namespace llvm {
101101
extern cl::opt<bool> PrintPipelinePasses;
102102

103103
cl::opt<bool> ClRemoveTraps("clang-remove-traps", cl::Optional,
104-
cl::desc("Insert remove-traps pass."),
105-
cl::init(false));
104+
cl::desc("Insert remove-traps pass."));
106105

107106
// Experiment to move sanitizers earlier.
108107
static cl::opt<bool> ClSanitizeOnOptimizerEarlyEP(
109108
"sanitizer-early-opt-ep", cl::Optional,
110-
cl::desc("Insert sanitizers on OptimizerEarlyEP."), cl::init(false));
109+
cl::desc("Insert sanitizers on OptimizerEarlyEP."));
111110

112111
extern cl::opt<InstrProfCorrelator::ProfCorrelatorKind> ProfileCorrelate;
113112

114113
// Re-link builtin bitcodes after optimization
115114
cl::opt<bool> ClRelinkBuiltinBitcodePostop(
116115
"relink-builtin-bitcode-postop", cl::Optional,
117-
cl::desc("Re-link builtin bitcodes after optimization."), cl::init(false));
116+
cl::desc("Re-link builtin bitcodes after optimization."));
118117
} // namespace llvm
119118

120119
namespace {

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ using namespace CodeGen;
5656
// Experiment to make sanitizers easier to debug
5757
static llvm::cl::opt<bool> ClSanitizeDebugDeoptimization(
5858
"ubsan-unique-traps", llvm::cl::Optional,
59-
llvm::cl::desc("Deoptimize traps for UBSAN so there is 1 trap per check"),
60-
llvm::cl::init(false));
59+
llvm::cl::desc("Deoptimize traps for UBSAN so there is 1 trap per check"));
6160

6261
//===--------------------------------------------------------------------===//
6362
// Miscellaneous Helper Methods

clang/lib/CodeGen/CGRecordLayoutBuilder.cpp

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,21 @@ struct CGRecordLowering {
185185
/// Lowers an ASTRecordLayout to a llvm type.
186186
void lower(bool NonVirtualBaseType);
187187
void lowerUnion(bool isNoUniqueAddress);
188-
void accumulateFields();
188+
void accumulateFields(bool isNonVirtualBaseType);
189189
RecordDecl::field_iterator
190-
accumulateBitFields(RecordDecl::field_iterator Field,
190+
accumulateBitFields(bool isNonVirtualBaseType,
191+
RecordDecl::field_iterator Field,
191192
RecordDecl::field_iterator FieldEnd);
192193
void computeVolatileBitfields();
193194
void accumulateBases();
194195
void accumulateVPtrs();
195196
void accumulateVBases();
196197
/// Recursively searches all of the bases to find out if a vbase is
197198
/// not the primary vbase of some base class.
198-
bool hasOwnStorage(const CXXRecordDecl *Decl, const CXXRecordDecl *Query);
199+
bool hasOwnStorage(const CXXRecordDecl *Decl,
200+
const CXXRecordDecl *Query) const;
199201
void calculateZeroInit();
202+
CharUnits calculateTailClippingOffset(bool isNonVirtualBaseType) const;
200203
/// Lowers bitfield storage types to I8 arrays for bitfields with tail
201204
/// padding that is or can potentially be used.
202205
void clipTailPadding();
@@ -287,7 +290,7 @@ void CGRecordLowering::lower(bool NVBaseType) {
287290
computeVolatileBitfields();
288291
return;
289292
}
290-
accumulateFields();
293+
accumulateFields(NVBaseType);
291294
// RD implies C++.
292295
if (RD) {
293296
accumulateVPtrs();
@@ -378,12 +381,12 @@ void CGRecordLowering::lowerUnion(bool isNoUniqueAddress) {
378381
Packed = true;
379382
}
380383

381-
void CGRecordLowering::accumulateFields() {
384+
void CGRecordLowering::accumulateFields(bool isNonVirtualBaseType) {
382385
for (RecordDecl::field_iterator Field = D->field_begin(),
383386
FieldEnd = D->field_end();
384387
Field != FieldEnd;) {
385388
if (Field->isBitField()) {
386-
Field = accumulateBitFields(Field, FieldEnd);
389+
Field = accumulateBitFields(isNonVirtualBaseType, Field, FieldEnd);
387390
assert((Field == FieldEnd || !Field->isBitField()) &&
388391
"Failed to accumulate all the bitfields");
389392
} else if (Field->isZeroSize(Context)) {
@@ -404,9 +407,12 @@ void CGRecordLowering::accumulateFields() {
404407
}
405408

406409
// Create members for bitfields. Field is a bitfield, and FieldEnd is the end
407-
// iterator of the record. Return the first non-bitfield encountered.
410+
// iterator of the record. Return the first non-bitfield encountered. We need
411+
// to know whether this is the base or complete layout, as virtual bases could
412+
// affect the upper bound of bitfield access unit allocation.
408413
RecordDecl::field_iterator
409-
CGRecordLowering::accumulateBitFields(RecordDecl::field_iterator Field,
414+
CGRecordLowering::accumulateBitFields(bool isNonVirtualBaseType,
415+
RecordDecl::field_iterator Field,
410416
RecordDecl::field_iterator FieldEnd) {
411417
if (isDiscreteBitFieldABI()) {
412418
// Run stores the first element of the current run of bitfields. FieldEnd is
@@ -505,6 +511,10 @@ CGRecordLowering::accumulateBitFields(RecordDecl::field_iterator Field,
505511
bitsToCharUnits(Context.getTargetInfo().getRegisterWidth());
506512
unsigned CharBits = Context.getCharWidth();
507513

514+
// Limit of useable tail padding at end of the record. Computed lazily and
515+
// cached here.
516+
CharUnits ScissorOffset = CharUnits::Zero();
517+
508518
// Data about the start of the span we're accumulating to create an access
509519
// unit from. Begin is the first bitfield of the span. If Begin is FieldEnd,
510520
// we've not got a current span. The span starts at the BeginOffset character
@@ -630,10 +640,14 @@ CGRecordLowering::accumulateBitFields(RecordDecl::field_iterator Field,
630640
LimitOffset = bitsToCharUnits(getFieldBitOffset(*Probe));
631641
goto FoundLimit;
632642
}
633-
// We reached the end of the fields. We can't necessarily use tail
634-
// padding in C++ structs, so the NonVirtual size is what we must
635-
// use there.
636-
LimitOffset = RD ? Layout.getNonVirtualSize() : Layout.getDataSize();
643+
// We reached the end of the fields, determine the bounds of useable
644+
// tail padding. As this can be complex for C++, we cache the result.
645+
if (ScissorOffset.isZero()) {
646+
ScissorOffset = calculateTailClippingOffset(isNonVirtualBaseType);
647+
assert(!ScissorOffset.isZero() && "Tail clipping at zero");
648+
}
649+
650+
LimitOffset = ScissorOffset;
637651
FoundLimit:;
638652

639653
CharUnits TypeSize = getSize(Type);
@@ -838,13 +852,17 @@ void CGRecordLowering::accumulateVPtrs() {
838852
llvm::PointerType::getUnqual(Types.getLLVMContext())));
839853
}
840854

841-
void CGRecordLowering::accumulateVBases() {
855+
CharUnits
856+
CGRecordLowering::calculateTailClippingOffset(bool isNonVirtualBaseType) const {
857+
if (!RD)
858+
return Layout.getDataSize();
859+
842860
CharUnits ScissorOffset = Layout.getNonVirtualSize();
843861
// In the itanium ABI, it's possible to place a vbase at a dsize that is
844862
// smaller than the nvsize. Here we check to see if such a base is placed
845863
// before the nvsize and set the scissor offset to that, instead of the
846864
// nvsize.
847-
if (isOverlappingVBaseABI())
865+
if (!isNonVirtualBaseType && isOverlappingVBaseABI())
848866
for (const auto &Base : RD->vbases()) {
849867
const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();
850868
if (BaseDecl->isEmpty())
@@ -856,8 +874,13 @@ void CGRecordLowering::accumulateVBases() {
856874
ScissorOffset = std::min(ScissorOffset,
857875
Layout.getVBaseClassOffset(BaseDecl));
858876
}
859-
Members.push_back(MemberInfo(ScissorOffset, MemberInfo::Scissor, nullptr,
860-
RD));
877+
878+
return ScissorOffset;
879+
}
880+
881+
void CGRecordLowering::accumulateVBases() {
882+
Members.push_back(MemberInfo(calculateTailClippingOffset(false),
883+
MemberInfo::Scissor, nullptr, RD));
861884
for (const auto &Base : RD->vbases()) {
862885
const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();
863886
if (BaseDecl->isEmpty())
@@ -882,7 +905,7 @@ void CGRecordLowering::accumulateVBases() {
882905
}
883906

884907
bool CGRecordLowering::hasOwnStorage(const CXXRecordDecl *Decl,
885-
const CXXRecordDecl *Query) {
908+
const CXXRecordDecl *Query) const {
886909
const ASTRecordLayout &DeclLayout = Context.getASTRecordLayout(Decl);
887910
if (DeclLayout.isPrimaryBaseVirtual() && DeclLayout.getPrimaryBase() == Query)
888911
return false;

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,53 +1146,38 @@ void tools::addOpenMPRuntimeSpecificRPath(const ToolChain &TC,
11461146

11471147
/// Adds the '-lcgpu' and '-lmgpu' libraries to the compilation to include the
11481148
/// LLVM C library for GPUs.
1149-
static void addOpenMPDeviceLibC(const ToolChain &TC, const ArgList &Args,
1149+
static void addOpenMPDeviceLibC(const Compilation &C, const ArgList &Args,
11501150
ArgStringList &CmdArgs) {
11511151
if (Args.hasArg(options::OPT_nogpulib) || Args.hasArg(options::OPT_nolibc))
11521152
return;
11531153

11541154
// Check the resource directory for the LLVM libc GPU declarations. If it's
11551155
// found we can assume that LLVM was built with support for the GPU libc.
1156-
SmallString<256> LibCDecls(TC.getDriver().ResourceDir);
1156+
SmallString<256> LibCDecls(C.getDriver().ResourceDir);
11571157
llvm::sys::path::append(LibCDecls, "include", "llvm_libc_wrappers",
11581158
"llvm-libc-decls");
11591159
bool HasLibC = llvm::sys::fs::exists(LibCDecls) &&
11601160
llvm::sys::fs::is_directory(LibCDecls);
11611161
if (!Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc, HasLibC))
11621162
return;
11631163

1164-
// We don't have access to the offloading toolchains here, so determine from
1165-
// the arguments if we have any active NVPTX or AMDGPU toolchains.
1166-
llvm::DenseSet<const char *> Libraries;
1167-
if (const Arg *Targets = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) {
1168-
if (llvm::any_of(Targets->getValues(),
1169-
[](auto S) { return llvm::Triple(S).isAMDGPU(); })) {
1170-
Libraries.insert("-lcgpu-amdgpu");
1171-
Libraries.insert("-lmgpu-amdgpu");
1172-
}
1173-
if (llvm::any_of(Targets->getValues(),
1174-
[](auto S) { return llvm::Triple(S).isNVPTX(); })) {
1175-
Libraries.insert("-lcgpu-nvptx");
1176-
Libraries.insert("-lmgpu-nvptx");
1177-
}
1178-
}
1164+
SmallVector<const ToolChain *> ToolChains;
1165+
auto TCRange = C.getOffloadToolChains(Action::OFK_OpenMP);
1166+
for (auto TI = TCRange.first, TE = TCRange.second; TI != TE; ++TI)
1167+
ToolChains.push_back(TI->second);
11791168

1180-
for (StringRef Arch : Args.getAllArgValues(options::OPT_offload_arch_EQ)) {
1181-
if (llvm::any_of(llvm::split(Arch, ","), [](StringRef Str) {
1182-
return IsAMDGpuArch(StringToCudaArch(Str));
1183-
})) {
1184-
Libraries.insert("-lcgpu-amdgpu");
1185-
Libraries.insert("-lmgpu-amdgpu");
1186-
}
1187-
if (llvm::any_of(llvm::split(Arch, ","), [](StringRef Str) {
1188-
return IsNVIDIAGpuArch(StringToCudaArch(Str));
1189-
})) {
1190-
Libraries.insert("-lcgpu-nvptx");
1191-
Libraries.insert("-lmgpu-nvptx");
1192-
}
1169+
if (llvm::any_of(ToolChains, [](const ToolChain *TC) {
1170+
return TC->getTriple().isAMDGPU();
1171+
})) {
1172+
CmdArgs.push_back("-lcgpu-amdgpu");
1173+
CmdArgs.push_back("-lmgpu-amdgpu");
1174+
}
1175+
if (llvm::any_of(ToolChains, [](const ToolChain *TC) {
1176+
return TC->getTriple().isNVPTX();
1177+
})) {
1178+
CmdArgs.push_back("-lcgpu-nvptx");
1179+
CmdArgs.push_back("-lmgpu-nvptx");
11931180
}
1194-
1195-
llvm::append_range(CmdArgs, Libraries);
11961181
}
11971182

11981183
void tools::addOpenMPRuntimeLibraryPath(const ToolChain &TC,
@@ -1253,9 +1238,10 @@ bool requiresCOMGrLinking(const ToolChain &TC, const ArgList &Args) {
12531238
return false;
12541239
}
12551240

1256-
bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
1257-
const ArgList &Args, bool ForceStaticHostRuntime,
1258-
bool IsOffloadingHost, bool GompNeedsRT) {
1241+
bool tools::addOpenMPRuntime(const Compilation &C, ArgStringList &CmdArgs,
1242+
const ToolChain &TC, const ArgList &Args,
1243+
bool ForceStaticHostRuntime, bool IsOffloadingHost,
1244+
bool GompNeedsRT) {
12591245
if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
12601246
options::OPT_fno_openmp, false))
12611247
return false;
@@ -1305,7 +1291,7 @@ bool tools::addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
13051291
CmdArgs.push_back("-lomptarget.devicertl");
13061292

13071293
if (IsOffloadingHost)
1308-
addOpenMPDeviceLibC(TC, Args, CmdArgs);
1294+
addOpenMPDeviceLibC(C, Args, CmdArgs);
13091295

13101296
addArchSpecificRPath(TC, Args, CmdArgs);
13111297

clang/lib/Driver/ToolChains/CommonArgs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ void addOpenMPRuntimeLibraryPath(const ToolChain &TC,
130130
const llvm::opt::ArgList &Args,
131131
llvm::opt::ArgStringList &CmdArgs);
132132
/// Returns true, if an OpenMP runtime has been added.
133-
bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC,
134-
const llvm::opt::ArgList &Args,
133+
bool addOpenMPRuntime(const Compilation &C, llvm::opt::ArgStringList &CmdArgs,
134+
const ToolChain &TC, const llvm::opt::ArgList &Args,
135135
bool ForceStaticHostRuntime = false,
136136
bool IsOffloadingHost = false, bool GompNeedsRT = false);
137137

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
686686
}
687687

688688
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
689-
addOpenMPRuntime(CmdArgs, getToolChain(), Args);
689+
addOpenMPRuntime(C, CmdArgs, getToolChain(), Args);
690690

691691
if (isObjCRuntimeLinked(Args) &&
692692
!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {

clang/lib/Driver/ToolChains/DragonFly.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
136136

137137
// Use the static OpenMP runtime with -static-openmp
138138
bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) && !Static;
139-
addOpenMPRuntime(CmdArgs, ToolChain, Args, StaticOpenMP);
139+
addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP);
140140

141141
if (D.CCCIsCXX()) {
142142
if (ToolChain.ShouldLinkCXXStdlib(Args))

clang/lib/Driver/ToolChains/FreeBSD.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
295295
// Use the static OpenMP runtime with -static-openmp
296296
bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
297297
!Args.hasArg(options::OPT_static);
298-
addOpenMPRuntime(CmdArgs, ToolChain, Args, StaticOpenMP);
298+
addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP);
299299

300300
if (D.CCCIsCXX()) {
301301
if (ToolChain.ShouldLinkCXXStdlib(Args))

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -609,12 +609,8 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
609609

610610
// FIXME: Only pass GompNeedsRT = true for platforms with libgomp that
611611
// require librt. Most modern Linux platforms do, but some may not.
612-
StringRef omptarget =
613-
Args.getLastArgValue(options::OPT_fopenmp_targets_EQ);
614-
bool isHostOffload = JA.isHostOffloading(Action::OFK_OpenMP) ||
615-
omptarget.equals("x86_64-pc-linux-gnu");
616-
if (addOpenMPRuntime(CmdArgs, ToolChain, Args, StaticOpenMP,
617-
isHostOffload,
612+
if (addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP,
613+
JA.isHostOffloading(Action::OFK_OpenMP),
618614
/* GompNeedsRT= */ true))
619615
// OpenMP runtimes implies pthreads when using the GNU toolchain.
620616
// FIXME: Does this really make sense for all GNU toolchains?

clang/lib/Driver/ToolChains/Haiku.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ void haiku::Linker::ConstructJob(Compilation &C, const JobAction &JA,
107107
options::OPT_r)) {
108108
// Use the static OpenMP runtime with -static-openmp
109109
bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) && !Static;
110-
addOpenMPRuntime(CmdArgs, ToolChain, Args, StaticOpenMP);
110+
addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP);
111111

112112
if (D.CCCIsCXX() && ToolChain.ShouldLinkCXXStdlib(Args))
113113
ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);

clang/lib/Driver/ToolChains/NetBSD.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
311311
options::OPT_r)) {
312312
// Use the static OpenMP runtime with -static-openmp
313313
bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) && !Static;
314-
addOpenMPRuntime(CmdArgs, ToolChain, Args, StaticOpenMP);
314+
addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP);
315315

316316
if (D.CCCIsCXX()) {
317317
if (ToolChain.ShouldLinkCXXStdlib(Args))

clang/lib/Driver/ToolChains/OpenBSD.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
221221
options::OPT_r)) {
222222
// Use the static OpenMP runtime with -static-openmp
223223
bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) && !Static;
224-
addOpenMPRuntime(CmdArgs, ToolChain, Args, StaticOpenMP);
224+
addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP);
225225

226226
if (D.CCCIsCXX()) {
227227
if (ToolChain.ShouldLinkCXXStdlib(Args))

clang/lib/Driver/ToolChains/Solaris.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
211211
// Use the static OpenMP runtime with -static-openmp
212212
bool StaticOpenMP = Args.hasArg(options::OPT_static_openmp) &&
213213
!Args.hasArg(options::OPT_static);
214-
addOpenMPRuntime(CmdArgs, ToolChain, Args, StaticOpenMP);
214+
addOpenMPRuntime(C, CmdArgs, ToolChain, Args, StaticOpenMP);
215215

216216
if (D.CCCIsCXX()) {
217217
if (ToolChain.ShouldLinkCXXStdlib(Args))

0 commit comments

Comments
 (0)