aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-12-30 20:54:24 +0200
committerVeikka Tuominen <git@vexu.eu>2022-12-30 21:24:40 +0200
commitbd711dfd255447883d25f422031592e3824ca296 (patch)
treeb3360e1780cd933d5ae79a16a141338fad11d557 /src/codegen/llvm.zig
parentf874b5e1e08860c169b9a318391aabedfd3f7ff0 (diff)
downloadzig-bd711dfd255447883d25f422031592e3824ca296.tar.gz
zig-bd711dfd255447883d25f422031592e3824ca296.zip
llvm: do not pad vector element debug types
Diffstat (limited to 'src/codegen/llvm.zig')
-rw-r--r--src/codegen/llvm.zig23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 230f306dac..c693beaabf 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -1725,10 +1725,31 @@ pub const Object = struct {
return array_di_ty;
},
.Vector => {
+ const elem_ty = ty.elemType2();
+ // Vector elements cannot be padded since that would make
+ // @bitSizOf(elem) * len > @bitSizOf(vec).
+ // Neither gdb nor lldb seem to be able to display non-byte sized
+ // vectors properly.
+ const elem_di_type = switch (elem_ty.zigTypeTag()) {
+ .Int => blk: {
+ const info = elem_ty.intInfo(target);
+ assert(info.bits != 0);
+ const name = try ty.nameAlloc(gpa, o.module);
+ defer gpa.free(name);
+ const dwarf_encoding: c_uint = switch (info.signedness) {
+ .signed => DW.ATE.signed,
+ .unsigned => DW.ATE.unsigned,
+ };
+ break :blk dib.createBasicType(name, info.bits, dwarf_encoding);
+ },
+ .Bool => dib.createBasicType("bool", 1, DW.ATE.boolean),
+ else => try o.lowerDebugType(ty.childType(), .full),
+ };
+
const vector_di_ty = dib.createVectorType(
ty.abiSize(target) * 8,
ty.abiAlignment(target) * 8,
- try o.lowerDebugType(ty.childType(), .full),
+ elem_di_type,
ty.vectorLen(),
);
// The recursive call to `lowerDebugType` means we can't use `gop` anymore.