projects
/
m6w6
/
ext-psi
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
build: fix package.xml
[m6w6/ext-psi]
/
src
/
libjit.c
diff --git
a/src/libjit.c
b/src/libjit.c
index 338e8a73de2b830457b67228204eae3433ae8cfb..51bdec5830cf63e524954c49f4b8df3c2c1c07d4 100644
(file)
--- a/
src/libjit.c
+++ b/
src/libjit.c
@@
-36,6
+36,12
@@
static inline jit_type_t psi_jit_decl_arg_type(struct psi_decl_arg *darg);
static inline jit_abi_t psi_jit_abi(const char *convention)
{
static inline jit_abi_t psi_jit_abi(const char *convention)
{
+ if (!strcasecmp(convention, "stdcall")) {
+ return jit_abi_stdcall;
+ }
+ if (!strcasecmp(convention, "fastcall")) {
+ return jit_abi_fastcall;
+ }
return jit_abi_cdecl;
}
static inline jit_type_t psi_jit_token_type(token_t t)
return jit_abi_cdecl;
}
static inline jit_type_t psi_jit_token_type(token_t t)
@@
-122,15
+128,23
@@
static unsigned psi_jit_struct_type_elements(struct psi_decl_struct *strct,
jit_type_t **fields)
{
size_t i = 0, argc = psi_plist_count(strct->args), nels = 0, offset = 0,
jit_type_t **fields)
{
size_t i = 0, argc = psi_plist_count(strct->args), nels = 0, offset = 0,
- maxalign;
+ maxalign
, last_arg_pos = -1
;
struct psi_decl_arg *darg;
*fields = calloc(argc + 1, sizeof(*fields));
while (psi_plist_get(strct->args, i++, &darg)) {
struct psi_decl_arg *darg;
*fields = calloc(argc + 1, sizeof(*fields));
while (psi_plist_get(strct->args, i++, &darg)) {
- jit_type_t type
= jit_type_copy(psi_jit_decl_arg_type(darg))
;
+ jit_type_t type;
size_t padding, alignment;
size_t padding, alignment;
+ if (darg->layout->pos == last_arg_pos) {
+ /* skip bit fields */
+ continue;
+ }
+ last_arg_pos = darg->layout->pos;
+
+ type = jit_type_copy(psi_jit_decl_arg_type(darg));
+
if ((alignment = jit_type_get_alignment(type)) > maxalign) {
maxalign = alignment;
}
if ((alignment = jit_type_get_alignment(type)) > maxalign) {
maxalign = alignment;
}