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
|
//===-- gen/dcompute/druntime.cpp -----------------------------------------===//
//
// LDC – the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
#include "gen/dcompute/druntime.h"
#include "dmd/aggregate.h"
#include "dmd/declaration.h"
#include "dmd/dsymbol.h"
#include "dmd/expression.h"
#include "dmd/id.h"
#include "dmd/identifier.h"
#include "dmd/module.h"
#include "dmd/template.h"
bool isFromLDC_Mod(Dsymbol *sym, Identifier* id) {
auto mod = sym->getModule();
if (!mod)
return false;
auto moduleDecl = mod->md;
if (!moduleDecl)
return false;
if (moduleDecl->packages.length != 1)
return false;
if (moduleDecl->packages.ptr[0] != Id::ldc)
return false;
return moduleDecl->id == id;
}
bool isFromLDC_DCompute(Dsymbol *sym) {
return isFromLDC_Mod(sym,Id::dcompute);
}
bool isFromLDC_OpenCL(Dsymbol *sym) {
return isFromLDC_Mod(sym,Id::opencl);
}
llvm::Optional<DcomputePointer> toDcomputePointer(StructDeclaration *sd) {
if (sd->ident != Id::dcPointer || !isFromLDC_DCompute(sd))
return llvm::Optional<DcomputePointer>(llvm::None);
TemplateInstance *ti = sd->isInstantiated();
int addrspace = isExpression((*ti->tiargs)[0])->toInteger();
Type *type = isType((*ti->tiargs)[1]);
return llvm::Optional<DcomputePointer>(DcomputePointer(addrspace, type));
}
|