libgcj/9078: libffi: problems with uint8 on powerpc
Matthias Klose
doko@net.local
Sat Dec 28 03:16:00 GMT 2002
>Number: 9078
>Category: libgcj
>Synopsis: libffi: problems with uint8 on powerpc
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sat Dec 28 03:16:02 PST 2002
>Closed-Date:
>Last-Modified:
>Originator: David Paul BELANGER <dbelan2@CS.McGill.CA>
>Release: 3.2.1 (Debian) (Debian unstable)
>Organization:
The Debian Project
>Environment:
System: Debian GNU/Linux (unstable)
Architecture: i686
host: i386-linux
>Description:
[ Reported to the Debian BTS as report #173074.
Please CC 173074@bugs.debian.org on replies.
Log of report can be found at http://bugs.debian.org/173074 ]
[ category libgcj, as there is no explicit libffi category]
ffi_type_uint8 and other arguments shorter than one word are
not passed in correctly to the function called by ffi_call.
Also, returns values are not passed correctly. For example, instead of
finding the returned byte value where the pointer points to, it is found
at an offset of 3 from the pointer.
This is related to the fact that the powerpc is a big endian machine and
somewhere, bytes need to be moved.
I have included code and output I get on my powerpc machine.
Thanks,
David
-----
#include <stdio.h>
#include <ffi.h>
unsigned char identity(unsigned char c) {
printf("identity: %d\n", c);
return c;
}
int main(void) {
ffi_cif cif;
ffi_type *args[1];
void *values[1];
int b;
unsigned char result;
int i;
args[0] = &ffi_type_uint;
/*
* args[0] = &ffi_type_uint8; - if this type is specified,
* function always receives 0.
*/
b = 24;
values[0] = &b;
if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
&ffi_type_uint8, args) != FFI_OK) {
printf("error\n");
return 1;
}
ffi_call(&cif, identity, &result, values);
printf("at result: %d\n", result);
printf("at result + 3: %d\n", *(&result + 3));
/*
for (i = 0; i < sizeof(result); i++) {
printf("byte %d = %d\n", i, *((unsigned char *) &result));
}
*/
return 0;
}
-----
output:
identity: 24
at result: 0
at result + 3: 24
-----
David
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the Java-prs
mailing list