diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2020-08-31 13:31:04 +0200 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2020-08-31 15:53:44 +0200 |
commit | 6940c20bbb3b5864e8b510de162d1a618aecca88 (patch) | |
tree | 687831cd276e5ea6f4c438ddb455886d1cfbe0a7 /gcc/d/decl.cc | |
parent | f089569851ca9c8a81400dd8a159f86636ed20ec (diff) | |
download | gcc-6940c20bbb3b5864e8b510de162d1a618aecca88.zip gcc-6940c20bbb3b5864e8b510de162d1a618aecca88.tar.gz gcc-6940c20bbb3b5864e8b510de162d1a618aecca88.tar.bz2 |
d: Fix ICEs in the front-end when pointer size is 16-bit.
In the lowering of `bt*' intrinsics, some integer constants had
mismatched types, and bitsize was set to the wrong value.
In base_vtable_offset, the base offset value was calculated incorrectly.
The TypeInfo_Class object is comprised of 18 pointers and 1 uint field,
so now the internal classinfo type size is used instead.
gcc/d/ChangeLog:
* d-target.cc (Target::_init): Don't set classinfosize.
* d-tree.h (base_vtable_offset): Move under typeinfo.cc section.
* decl.cc (base_vtable_offset): Move to...
* typeinfo.cc (base_vtable_offset): ...here. Get base offset from
internal TypeInfo_Class type.
* intrinsics.cc (expand_intrinsic_bt): Use pointer TYPE_SIZE for
setting bitsize value. Build integer constants of correct type.
Diffstat (limited to 'gcc/d/decl.cc')
-rw-r--r-- | gcc/d/decl.cc | 36 |
1 files changed, 0 insertions, 36 deletions
diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc index 008a2bb..8e4237d 100644 --- a/gcc/d/decl.cc +++ b/gcc/d/decl.cc @@ -1991,42 +1991,6 @@ mark_needed (tree decl) } } -/* Get the offset to the BC's vtbl[] initializer from the start of CD. - Returns "~0u" if the base class is not found in any vtable interfaces. */ - -unsigned -base_vtable_offset (ClassDeclaration *cd, BaseClass *bc) -{ - unsigned csymoffset = target.classinfosize; - unsigned interfacesize = int_size_in_bytes (vtbl_interface_type_node); - csymoffset += cd->vtblInterfaces->length * interfacesize; - - for (size_t i = 0; i < cd->vtblInterfaces->length; i++) - { - BaseClass *b = (*cd->vtblInterfaces)[i]; - if (b == bc) - return csymoffset; - csymoffset += b->sym->vtbl.length * target.ptrsize; - } - - /* Check all overriding interface vtbl[]s. */ - for (ClassDeclaration *cd2 = cd->baseClass; cd2; cd2 = cd2->baseClass) - { - for (size_t k = 0; k < cd2->vtblInterfaces->length; k++) - { - BaseClass *bs = (*cd2->vtblInterfaces)[k]; - if (bs->fillVtbl (cd, NULL, 0)) - { - if (bc == bs) - return csymoffset; - csymoffset += bs->sym->vtbl.length * target.ptrsize; - } - } - } - - return ~0u; -} - /* Get the VAR_DECL of the vtable symbol for DECL. If this does not yet exist, create it. The vtable is accessible via ClassInfo, but since it is needed frequently (like for rtti comparisons), make it directly accessible. */ |