Mercurial > projects > ldc
comparison gen/abi-generic.h @ 1359:34f2fd925de3
Intrinsics shouldn't see struct padding, so use a special TargetABI for them
that removes it.
This unbreaks the `llvm_*_with_overflow` intrinsics.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sat, 16 May 2009 13:06:49 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1357:48747003a5de | 1359:34f2fd925de3 |
---|---|
1 #ifndef LDC_GEN_ABI_GENERIC | |
2 #define LDC_GEN_ABI_GENERIC | |
3 | |
4 #include "gen/llvmhelpers.h" | |
5 #include "gen/tollvm.h" | |
6 #include "gen/structs.h" | |
7 | |
8 /// Removes padding fields for (non-union-containing!) structs | |
9 struct RemoveStructPadding : ABIRewrite { | |
10 /// get a rewritten value back to its original form | |
11 virtual LLValue* get(Type* dty, DValue* v) { | |
12 LLValue* lval = DtoAlloca(dty, ".rewritetmp"); | |
13 | |
14 // Make sure the padding is zero, so struct comparisons work. | |
15 // TODO: Only do this if there's padding, and/or only initialize padding. | |
16 DtoMemSetZero(lval, DtoConstSize_t(getTypePaddedSize(DtoType(dty)))); | |
17 | |
18 DtoPaddedStruct(dty, v->getRVal(), lval); | |
19 return lval; | |
20 } | |
21 | |
22 /// get a rewritten value back to its original form and store result in provided lvalue | |
23 /// this one is optional and defaults to calling the one above | |
24 virtual void getL(Type* dty, DValue* v, llvm::Value* lval) { | |
25 DtoPaddedStruct(dty, v->getRVal(), lval); | |
26 } | |
27 | |
28 /// put out rewritten value | |
29 virtual LLValue* put(Type* dty, DValue* v) { | |
30 return DtoUnpaddedStruct(dty, v->getRVal()); | |
31 } | |
32 | |
33 /// return the transformed type for this rewrite | |
34 virtual const LLType* type(Type* dty, const LLType* t) { | |
35 return DtoUnpaddedStructType(dty); | |
36 } | |
37 }; | |
38 | |
39 #endif |