Skip to content

Commit 9b84621

Browse files
committed
[CIR][CIRGen] Move CIRGenModule::getTargetCIRGenInfo() to CIRGenModule
1 parent f9c0515 commit 9b84621

File tree

3 files changed

+101
-59
lines changed

3 files changed

+101
-59
lines changed

clang/lib/CIR/CodeGen/CIRGenModule.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,62 @@ void CIRGenModule::setDSOLocal(CIRGlobalValueInterface GV) const {
506506
GV.setDSOLocal(shouldAssumeDSOLocal(*this, GV));
507507
}
508508

509+
const TargetCIRGenInfo &CIRGenModule::getTargetCIRGenInfo() {
510+
if (TheTargetCIRGenInfo)
511+
return *TheTargetCIRGenInfo;
512+
513+
// Helper to set the unique_ptr while still keeping the return value.
514+
auto SetCIRGenInfo = [&](TargetCIRGenInfo *P) -> const TargetCIRGenInfo & {
515+
this->TheTargetCIRGenInfo.reset(P);
516+
return *P;
517+
};
518+
519+
const llvm::Triple &Triple = getTarget().getTriple();
520+
521+
switch (Triple.getArch()) {
522+
default:
523+
assert(false && "Target not yet supported!");
524+
525+
case llvm::Triple::aarch64_be:
526+
case llvm::Triple::aarch64: {
527+
AArch64ABIKind Kind = AArch64ABIKind::AAPCS;
528+
assert(getTarget().getABI() == "aapcs" ||
529+
getTarget().getABI() == "darwinpcs" &&
530+
"Only Darwin supported for aarch64");
531+
Kind = AArch64ABIKind::DarwinPCS;
532+
return *(TheTargetCIRGenInfo =
533+
createAArch64TargetCIRGenInfo(genTypes, Kind));
534+
}
535+
536+
case llvm::Triple::x86_64: {
537+
StringRef ABI = getTarget().getABI();
538+
X86AVXABILevel AVXLevel = (ABI == "avx512" ? X86AVXABILevel::AVX512
539+
: ABI == "avx" ? X86AVXABILevel::AVX
540+
: X86AVXABILevel::None);
541+
542+
switch (Triple.getOS()) {
543+
default:
544+
assert(false && "OSType NYI");
545+
case llvm::Triple::Linux:
546+
return *(TheTargetCIRGenInfo =
547+
createX86_64TargetCIRGenInfo(genTypes, AVXLevel));
548+
}
549+
}
550+
551+
case llvm::Triple::spirv64: {
552+
return *(TheTargetCIRGenInfo = createSPIRVTargetCIRGenInfo(genTypes));
553+
}
554+
555+
case llvm::Triple::nvptx64: {
556+
return *(TheTargetCIRGenInfo = createNVPTXTargetCIRGenInfo(genTypes));
557+
}
558+
559+
case llvm::Triple::amdgcn: {
560+
return *(TheTargetCIRGenInfo = createAMDGPUTargetCIRGenInfo(genTypes));
561+
}
562+
}
563+
}
564+
509565
const ABIInfo &CIRGenModule::getABIInfo() {
510566
return getTargetCIRGenInfo().getABIInfo();
511567
}

clang/lib/CIR/CodeGen/TargetInfo.cpp

Lines changed: 30 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,9 @@ class DefaultABIInfo : public ABIInfo {
9595
//===----------------------------------------------------------------------===//
9696

9797
namespace {
98+
using ABIKind = cir::AArch64ABIKind;
9899

99100
class AArch64ABIInfo : public ABIInfo {
100-
public:
101-
enum ABIKind { AAPCS = 0, DarwinPCS, Win64 };
102-
103101
private:
104102
ABIKind Kind;
105103

@@ -113,7 +111,7 @@ class AArch64ABIInfo : public ABIInfo {
113111

114112
private:
115113
ABIKind getABIKind() const { return Kind; }
116-
bool isDarwinPCS() const { return Kind == DarwinPCS; }
114+
bool isDarwinPCS() const { return Kind == ABIKind::DarwinPCS; }
117115

118116
cir::ABIArgInfo classifyReturnType(QualType RetTy, bool IsVariadic) const;
119117
cir::ABIArgInfo classifyArgumentType(QualType RetTy, bool IsVariadic,
@@ -143,12 +141,18 @@ class AArch64ABIInfo : public ABIInfo {
143141

144142
class AArch64TargetCIRGenInfo : public TargetCIRGenInfo {
145143
public:
146-
AArch64TargetCIRGenInfo(CIRGenTypes &CGT, AArch64ABIInfo::ABIKind Kind)
144+
AArch64TargetCIRGenInfo(CIRGenTypes &CGT, ABIKind Kind)
147145
: TargetCIRGenInfo(std::make_unique<AArch64ABIInfo>(CGT, Kind)) {}
148146
};
149147

150148
} // namespace
151149

150+
std::unique_ptr<TargetCIRGenInfo>
151+
clang::CIRGen::createAArch64TargetCIRGenInfo(CIRGenTypes &CGT,
152+
cir::AArch64ABIKind Kind) {
153+
return std::make_unique<AArch64TargetCIRGenInfo>(CGT, Kind);
154+
}
155+
152156
//===----------------------------------------------------------------------===//
153157
// X86 ABI Implementation
154158
//===----------------------------------------------------------------------===//
@@ -230,6 +234,12 @@ class X86_64TargetCIRGenInfo : public TargetCIRGenInfo {
230234
};
231235
} // namespace
232236

237+
std::unique_ptr<TargetCIRGenInfo>
238+
clang::CIRGen::createX86_64TargetCIRGenInfo(CIRGenTypes &CGT,
239+
X86AVXABILevel AVXLevel) {
240+
return std::make_unique<X86_64TargetCIRGenInfo>(CGT, AVXLevel);
241+
}
242+
233243
//===----------------------------------------------------------------------===//
234244
// Base ABI and target codegen info implementation common between SPIR and
235245
// SPIR-V.
@@ -309,6 +319,11 @@ class SPIRVTargetCIRGenInfo : public CommonSPIRTargetCIRGenInfo {
309319

310320
} // namespace
311321

322+
std::unique_ptr<TargetCIRGenInfo>
323+
clang::CIRGen::createSPIRVTargetCIRGenInfo(CIRGenTypes &CGT) {
324+
return std::make_unique<SPIRVTargetCIRGenInfo>(CGT);
325+
}
326+
312327
//===----------------------------------------------------------------------===//
313328
// NVPTX ABI Implementation
314329
//===----------------------------------------------------------------------===//
@@ -333,6 +348,11 @@ class NVPTXTargetCIRGenInfo : public TargetCIRGenInfo {
333348

334349
} // namespace
335350

351+
std::unique_ptr<TargetCIRGenInfo>
352+
clang::CIRGen::createNVPTXTargetCIRGenInfo(CIRGenTypes &CGT) {
353+
return std::make_unique<NVPTXTargetCIRGenInfo>(CGT);
354+
}
355+
336356
//===----------------------------------------------------------------------===//
337357
// AMDGPU ABI Implementation
338358
//===----------------------------------------------------------------------===//
@@ -361,6 +381,11 @@ class AMDGPUTargetCIRGenInfo : public TargetCIRGenInfo {
361381

362382
} // namespace
363383

384+
std::unique_ptr<TargetCIRGenInfo>
385+
clang::CIRGen::createAMDGPUTargetCIRGenInfo(CIRGenTypes &CGT) {
386+
return std::make_unique<AMDGPUTargetCIRGenInfo>(CGT);
387+
}
388+
364389
// TODO(cir): remove the attribute once this gets used.
365390
LLVM_ATTRIBUTE_UNUSED
366391
static bool classifyReturnType(const CIRGenCXXABI &CXXABI,
@@ -702,57 +727,3 @@ mlir::Value TargetCIRGenInfo::performAddrSpaceCast(
702727
// Try to preserve the source's name to make IR more readable.
703728
return CGF.getBuilder().createAddrSpaceCast(Src, DestTy);
704729
}
705-
706-
const TargetCIRGenInfo &CIRGenModule::getTargetCIRGenInfo() {
707-
if (TheTargetCIRGenInfo)
708-
return *TheTargetCIRGenInfo;
709-
710-
// Helper to set the unique_ptr while still keeping the return value.
711-
auto SetCIRGenInfo = [&](TargetCIRGenInfo *P) -> const TargetCIRGenInfo & {
712-
this->TheTargetCIRGenInfo.reset(P);
713-
return *P;
714-
};
715-
716-
const llvm::Triple &Triple = getTarget().getTriple();
717-
718-
switch (Triple.getArch()) {
719-
default:
720-
assert(false && "Target not yet supported!");
721-
722-
case llvm::Triple::aarch64_be:
723-
case llvm::Triple::aarch64: {
724-
AArch64ABIInfo::ABIKind Kind = AArch64ABIInfo::AAPCS;
725-
assert(getTarget().getABI() == "aapcs" ||
726-
getTarget().getABI() == "darwinpcs" &&
727-
"Only Darwin supported for aarch64");
728-
Kind = AArch64ABIInfo::DarwinPCS;
729-
return SetCIRGenInfo(new AArch64TargetCIRGenInfo(genTypes, Kind));
730-
}
731-
732-
case llvm::Triple::x86_64: {
733-
StringRef ABI = getTarget().getABI();
734-
X86AVXABILevel AVXLevel = (ABI == "avx512" ? X86AVXABILevel::AVX512
735-
: ABI == "avx" ? X86AVXABILevel::AVX
736-
: X86AVXABILevel::None);
737-
738-
switch (Triple.getOS()) {
739-
default:
740-
assert(false && "OSType NYI");
741-
case llvm::Triple::Linux:
742-
return SetCIRGenInfo(new X86_64TargetCIRGenInfo(genTypes, AVXLevel));
743-
}
744-
}
745-
746-
case llvm::Triple::spirv64: {
747-
return SetCIRGenInfo(new SPIRVTargetCIRGenInfo(genTypes));
748-
}
749-
750-
case llvm::Triple::nvptx64: {
751-
return SetCIRGenInfo(new NVPTXTargetCIRGenInfo(genTypes));
752-
}
753-
754-
case llvm::Triple::amdgcn: {
755-
return SetCIRGenInfo(new AMDGPUTargetCIRGenInfo(genTypes));
756-
}
757-
}
758-
}

clang/lib/CIR/CodeGen/TargetInfo.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include "CIRGenValue.h"
1919
#include "mlir/IR/Types.h"
2020
#include "clang/CIR/Dialect/IR/CIRAttrs.h"
21+
#include "clang/CIR/Target/AArch64.h"
22+
#include "clang/CIR/Target/x86.h"
2123

2224
#include <memory>
2325

@@ -122,8 +124,21 @@ class TargetCIRGenInfo {
122124
virtual ~TargetCIRGenInfo() {}
123125
};
124126

127+
std::unique_ptr<TargetCIRGenInfo>
128+
createAArch64TargetCIRGenInfo(CIRGenTypes &CGT, cir::AArch64ABIKind Kind);
129+
130+
std::unique_ptr<TargetCIRGenInfo>
131+
createX86_64TargetCIRGenInfo(CIRGenTypes &CGT, cir::X86AVXABILevel AVXLevel);
132+
125133
void computeSPIRKernelABIInfo(CIRGenModule &CGM, CIRGenFunctionInfo &FI);
126134

135+
std::unique_ptr<TargetCIRGenInfo> createSPIRVTargetCIRGenInfo(CIRGenTypes &CGT);
136+
137+
std::unique_ptr<TargetCIRGenInfo> createNVPTXTargetCIRGenInfo(CIRGenTypes &CGT);
138+
139+
std::unique_ptr<TargetCIRGenInfo>
140+
createAMDGPUTargetCIRGenInfo(CIRGenTypes &CGT);
141+
127142
} // namespace clang::CIRGen
128143

129144
#endif

0 commit comments

Comments
 (0)