Skip to content

Commit 9ff80af

Browse files
authored
[CIR][CIRGen] Move CIRGenModule::getTargetCIRGenInfo() to CIRGenModule.cpp (#1426)
Makes it consistent with C++ conventions and [OG](https://github.com/advay168/clangir/blob/436c635af6c7ec3d184a1f7e92a624acdf856991/clang/lib/CodeGen/CodeGenModule.cpp#L108).
1 parent 994dee0 commit 9ff80af

File tree

4 files changed

+96
-60
lines changed

4 files changed

+96
-60
lines changed

clang/lib/CIR/CodeGen/CIRGenModule.cpp

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

510+
const TargetCIRGenInfo &CIRGenModule::getTargetCIRGenInfo() {
511+
if (theTargetCIRGenInfo)
512+
return *theTargetCIRGenInfo;
513+
514+
const llvm::Triple &triple = getTarget().getTriple();
515+
516+
switch (triple.getArch()) {
517+
default:
518+
assert(false && "Target not yet supported!");
519+
520+
case llvm::Triple::aarch64_be:
521+
case llvm::Triple::aarch64: {
522+
AArch64ABIKind kind = AArch64ABIKind::AAPCS;
523+
assert(getTarget().getABI() == "aapcs" ||
524+
getTarget().getABI() == "darwinpcs" &&
525+
"Only Darwin supported for aarch64");
526+
kind = AArch64ABIKind::DarwinPCS;
527+
return *(theTargetCIRGenInfo =
528+
createAArch64TargetCIRGenInfo(genTypes, kind));
529+
}
530+
531+
case llvm::Triple::x86_64: {
532+
StringRef abi = getTarget().getABI();
533+
X86AVXABILevel avxLevel = (abi == "avx512" ? X86AVXABILevel::AVX512
534+
: abi == "avx" ? X86AVXABILevel::AVX
535+
: X86AVXABILevel::None);
536+
537+
switch (triple.getOS()) {
538+
default:
539+
assert(false && "OSType NYI");
540+
case llvm::Triple::Linux:
541+
return *(theTargetCIRGenInfo =
542+
createX86_64TargetCIRGenInfo(genTypes, avxLevel));
543+
}
544+
}
545+
546+
case llvm::Triple::spirv64: {
547+
return *(theTargetCIRGenInfo = createSPIRVTargetCIRGenInfo(genTypes));
548+
}
549+
550+
case llvm::Triple::nvptx64: {
551+
return *(theTargetCIRGenInfo = createNVPTXTargetCIRGenInfo(genTypes));
552+
}
553+
554+
case llvm::Triple::amdgcn: {
555+
return *(theTargetCIRGenInfo = createAMDGPUTargetCIRGenInfo(genTypes));
556+
}
557+
}
558+
}
559+
510560
const ABIInfo &CIRGenModule::getABIInfo() {
511561
return getTargetCIRGenInfo().getABIInfo();
512562
}

clang/lib/CIR/CodeGen/CIRGenModule.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class CIRGenModule : public CIRGenTypeCache {
7474
const std::string &getModuleNameHash() const { return ModuleNameHash; }
7575

7676
private:
77-
mutable std::unique_ptr<TargetCIRGenInfo> TheTargetCIRGenInfo;
77+
mutable std::unique_ptr<TargetCIRGenInfo> theTargetCIRGenInfo;
7878

7979
/// The builder is a helper class to create IR inside a function. The
8080
/// builder is stateful, in particular it keeps an "insertion point": this

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)