Intrinsics shouldn't see struct padding, so use a special TargetABI for them

that removes it.
This unbreaks the `llvm_*_with_overflow` intrinsics.
This commit is contained in:
Frits van Bommel
2009-05-16 13:06:49 +02:00
parent 62e8384da0
commit 541f3723cd
7 changed files with 219 additions and 60 deletions

View File

@@ -43,7 +43,7 @@
#include "gen/llvmhelpers.h"
#include "gen/abi.h"
#include "gen/abi-x86-64.h"
#include "gen/structs.h"
#include "gen/abi-generic.h"
#include "ir/irfunction.h"
#include <cassert>
@@ -485,38 +485,6 @@ struct X86_64_C_struct_rewrite : ABIRewrite {
};
/// Removes padding fields for (non-union-containing!) structs
struct RemoveStructPadding : ABIRewrite {
/// get a rewritten value back to its original form
virtual LLValue* get(Type* dty, DValue* v) {
LLValue* lval = DtoAlloca(dty, ".rewritetmp");
// Make sure the padding is zero, so struct comparisons work.
// TODO: Only do this if there's padding, and/or only initialize padding.
DtoMemSetZero(lval, DtoConstSize_t(getTypePaddedSize(DtoType(dty))));
DtoPaddedStruct(dty, v->getRVal(), lval);
return lval;
}
/// get a rewritten value back to its original form and store result in provided lvalue
/// this one is optional and defaults to calling the one above
virtual void getL(Type* dty, DValue* v, llvm::Value* lval) {
DtoPaddedStruct(dty, v->getRVal(), lval);
}
/// put out rewritten value
virtual LLValue* put(Type* dty, DValue* v) {
return DtoUnpaddedStruct(dty, v->getRVal());
}
/// return the transformed type for this rewrite
virtual const LLType* type(Type* dty, const LLType* t) {
return DtoUnpaddedStructType(dty);
}
};
struct RegCount {
unsigned char int_regs, sse_regs;
};