forked from ldc-developers/ldc
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathirtypestruct.cpp
More file actions
105 lines (85 loc) · 3.25 KB
/
Copy pathirtypestruct.cpp
File metadata and controls
105 lines (85 loc) · 3.25 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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//===-- irtypestruct.cpp --------------------------------------------------===//
//
// LDC – the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
#include "ir/irtypestruct.h"
#include "dmd/aggregate.h"
#include "dmd/declaration.h"
#include "dmd/errors.h"
#include "dmd/init.h"
#include "dmd/mtype.h"
#include "dmd/template.h"
#include "gen/dcompute/target.h"
#include "gen/dcompute/druntime.h"
#include "gen/irstate.h"
#include "gen/llvmhelpers.h"
#include "gen/logger.h"
#include "gen/tollvm.h"
#include "llvm/IR/DerivedTypes.h"
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
IrTypeStruct::IrTypeStruct(StructDeclaration *sd)
: IrTypeAggr(sd), sd(sd), ts(static_cast<TypeStruct *>(sd->type)) {}
//////////////////////////////////////////////////////////////////////////////
std::vector<IrTypeStruct *> IrTypeStruct::dcomputeTypes;
/// Resets special DCompute structs so they get re-created
/// with the proper address space when generating device code.
void IrTypeStruct::resetDComputeTypes() {
for (auto irTypeStruct : dcomputeTypes) {
auto &ctype = getIrType(irTypeStruct->dtype);
delete ctype;
ctype = nullptr;
}
dcomputeTypes.clear();
}
//////////////////////////////////////////////////////////////////////////////
IrTypeStruct *IrTypeStruct::get(StructDeclaration *sd) {
IF_LOG Logger::println("Building struct type %s @ %s", sd->toPrettyChars(),
sd->loc.toChars());
LOG_SCOPE;
auto t = new IrTypeStruct(sd);
getIrType(sd->type) = t;
// if it's a forward declaration, all bets are off, stick with the opaque
if (sd->sizeok != Sizeok::done) {
// but rewrite the name for special OpenCL types
if (isFromLDC_OpenCL(sd)) {
const int prefixlen = 4; // == sizeof("ldc.")
LLStructType *st = static_cast<LLStructType *>(t->type);
st->setName(st->getName().substr(prefixlen));
}
return t;
}
if(isFromLDC_DCompute(sd)) {
dcomputeTypes.push_back(t);
}
// For ldc.dcomptetypes.Pointer!(uint n,T),
// emit { T addrspace(gIR->dcomputetarget->mapping[n])* }
llvm::Optional<DcomputePointer> p;
if (gIR->dcomputetarget && (p = toDcomputePointer(sd))) {
// Translate the virtual dcompute address space into the real one for
// the target
int realAS = gIR->dcomputetarget->mapping[p->addrspace];
llvm::SmallVector<LLType *, 1> body;
body.push_back(DtoMemType(p->type)->getPointerTo(realAS));
isaStruct(t->type)->setBody(body, false);
VarGEPIndices v;
v[sd->fields[0]] = 0;
t->varGEPIndices = v;
} else {
AggrTypeBuilder builder;
builder.addAggregate(sd);
builder.addTailPadding(sd->structsize);
isaStruct(t->type)->setBody(builder.defaultTypes(), builder.isPacked());
t->varGEPIndices = builder.varGEPIndices();
if (getTypeAllocSize(t->type) != sd->structsize) {
error(sd->loc, "ICE: struct IR size does not match the frontend size");
fatal();
}
}
IF_LOG Logger::cout() << "final struct type: " << *t->type << std::endl;
return t;
}