LLVM: insert debug logging when LLVM ABI size is wrong

This commit is contained in:
Andrew Kelley 2022-07-14 19:30:56 -07:00
parent 4c7fe74b2c
commit 070e3ea37d
2 changed files with 24 additions and 0 deletions

View File

@ -2424,6 +2424,24 @@ pub const DeclGen = struct {
}
fn lowerType(dg: *DeclGen, t: Type) Allocator.Error!*const llvm.Type {
const llvm_ty = try lowerTypeInner(dg, t);
if (std.debug.runtime_safety) {
if (t.zigTypeTag() != .Opaque and t.hasRuntimeBits() and
!llvm_ty.isOpaqueStruct().toBool())
{
const zig_size = t.abiSize(dg.module.getTarget());
const llvm_size = dg.object.target_data.abiSizeOfType(llvm_ty);
if (llvm_size != zig_size) {
log.err("when lowering {}, Zig ABI size = {d} but LLVM ABI size = {d}", .{
t.fmt(dg.module), zig_size, llvm_size,
});
}
}
}
return llvm_ty;
}
fn lowerTypeInner(dg: *DeclGen, t: Type) Allocator.Error!*const llvm.Type {
const gpa = dg.gpa;
const target = dg.module.getTarget();
switch (t.zigTypeTag()) {

View File

@ -301,6 +301,9 @@ pub const Type = opaque {
pub const countStructElementTypes = LLVMCountStructElementTypes;
extern fn LLVMCountStructElementTypes(StructTy: *const Type) c_uint;
pub const isOpaqueStruct = LLVMIsOpaqueStruct;
extern fn LLVMIsOpaqueStruct(StructTy: *const Type) Bool;
};
pub const Module = opaque {
@ -1032,6 +1035,9 @@ pub const TargetData = opaque {
pub const abiAlignmentOfType = LLVMABIAlignmentOfType;
extern fn LLVMABIAlignmentOfType(TD: *const TargetData, Ty: *const Type) c_uint;
pub const abiSizeOfType = LLVMABISizeOfType;
extern fn LLVMABISizeOfType(TD: *const TargetData, Ty: *const Type) c_ulonglong;
};
pub const CodeModel = enum(c_int) {