-
-
Notifications
You must be signed in to change notification settings - Fork 282
Expand file tree
/
Copy pathspirv.cpp
More file actions
64 lines (57 loc) · 2 KB
/
spirv.cpp
File metadata and controls
64 lines (57 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//===-- gen/abi-spirv.cpp ---------------------------------------*- C++ -*-===//
//
// LDC – the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
#include "gen/abi/abi.h"
#include "gen/dcompute/druntime.h"
#include "gen/uda.h"
#include "dmd/declaration.h"
#include "gen/tollvm.h"
#include "gen/dcompute/abi-rewrites.h"
using namespace dmd;
struct SPIRVTargetABI : TargetABI {
DComputePointerRewrite pointerRewite;
llvm::CallingConv::ID callingConv(LINK l) override {
assert(l == LINK::c);
return llvm::CallingConv::SPIR_FUNC;
}
llvm::CallingConv::ID callingConv(FuncDeclaration *fdecl) override {
return getKernelAttr(fdecl) ? llvm::CallingConv::SPIR_KERNEL
: llvm::CallingConv::SPIR_FUNC;
}
bool passByVal(TypeFunction *, Type *t) override {
return DtoIsInMemoryOnly(t) && isPOD(t) && size(t) > 64;
}
bool returnInArg(TypeFunction *tf, bool) override {
Type *retty = tf->next->toBasetype();
if (retty->ty == TY::Tsarray)
return true;
else if (auto st = retty->isTypeStruct())
return !toDcomputePointer(st->sym);
else
return false;
}
void rewriteArgument(IrFuncTy &fty, IrFuncTyArg &arg) override {
TargetABI::rewriteArgument(fty, arg);
if (arg.rewrite)
return;
Type *ty = arg.type->toBasetype();
llvm::Optional<DcomputePointer> ptr;
if (ty->ty == TY::Tstruct &&
(ptr = toDcomputePointer(static_cast<TypeStruct *>(ty)->sym))) {
pointerRewite.applyTo(arg);
}
}
};
TargetABI *createSPIRVABI() { return new SPIRVTargetABI(); }
struct SPIRVVulkanTargetABI : SPIRVTargetABI {
llvm::CallingConv::ID callingConv(FuncDeclaration *fdecl) override {
// The synthesised wrapper is SPIR_KERNEL
return llvm::CallingConv::SPIR_FUNC;
}
};
TargetABI *createSPIRVVulkanABI() { return new SPIRVVulkanTargetABI(); }