mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-06-08 17:54:10 +02:00
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:
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user