lua-for-android icon indicating copy to clipboard operation
lua-for-android copied to clipboard

Error on arm32

Open mingodad opened this issue 7 years ago • 35 comments

Hello ! Testing your project with with the apk on android arm32 (nexus7) this program fail:

local ffi = require('ffi')
local buf = ffi.new('char[256]')
local c = ffi.C
ffi.cdef('int sprintf(char *buf, const char *fmt, ...);')
print(c.sprintf(buf, '%g', 5.3), ffi.string(buf));

Expected:

3    5.3

Output:

11   2.14609e+41

The above and the following are from the original test.lua and it also fail the following with segfault:

-- unsigned should be ignored for pointer rules
ffi.cdef([=[
int strncmp(const signed char *s1, const unsigned char *s2, size_t n);
]=]);
assert(ffi.C.strncmp("two", "three", 3) ~= 0); -- segfault here
...
-- Test io.tmpfile()
ffi.cdef ([=[
    int fprintf ( FILE * stream, const char * format, ... );
]=]);
local f = io.tmpfile();
ffi.C.fprintf(f, "test: %s\n", "foo"); -- segfault here

f:seek("set", 0);
local str = f:read('*l');
assert(str == 'test: foo', str);
f:close();

Commenting the above mentioned tests all the rest of test.lua pass. Great work !

mingodad avatar Jan 15 '19 21:01 mingodad

The first is a alignment bug, the second I can not reproduce it,and the third is because io.tempfile only generates a valid pointer for the io library, not for the ffi library. May be fix or not.

Domingo Alvarez Duarte [email protected] 于 2019年1月16日周三 05:41写道:

Hello ! Testing your project with with the apk on android arm32 (nexus7) this program fail:

local ffi = require('ffi') local buf = ffi.new('char[256]') local c = ffi.C ffi.cdef('int sprintf(char *buf, const char *fmt, ...);') print(csprintf(buf, '%g', 5.3), ffi.string(buf));

Expected:

3 5.3

Output:

11 2.14609e+41

The above and the following are from the original test.lua and it also fail the following with segfault:

// unsigned should be ignored for pointer rules ffi.cdef([=[ int strncmp(const signed char *s1, const unsigned char *s2, size_t n); ]=]); assert(ffi.C.strncmp("two", "three", 3) ~= 0); -- segfault here ... // Test io.tmpfile() ffi.cdef ([=[ int fprintf ( FILE * stream, const char * format, ... ); ]=]); local f = io.tmpfile(); ffi.C.fprintf(f, "test: %s\n", "foo"); -- segfault here

f:seek("set", 0); local str = f:read('*l'); assert(str == 'test: foo', str); f:close();

Commenting the above mentioned tests all the rest of test.lua pass. Great work !

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUmkGq-Wf2qIXa_YAfKg5HLUfaZkAks5vDkrsgaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 05:01 qtiuto

Hello ! After removing the meta method optimisation I've got it to compile again but now it fails here:

assert(c.sprintf(buf, "%d%g", false, 6.7) == 4 && ffi.string(buf) == '06.7');

Output of:

print(c.sprintf(buf, "%d%g", false, 6.7),  ffi.string(buf));
8	03.41612

It was passing before. And it still segfaults here:

assert(ffi.C.strncmp("two", "three", 3) ~= 0);

mingodad avatar Jan 16 '19 14:01 mingodad

Does it only happen on arm? Does it happen on emulator? Does it happen on other devices? My device has no problem with these bugs. The bug with strncmp seems pretty weird. I will test them on emulator later.

Domingo Alvarez Duarte [email protected] 于 2019年1月16日周三 22:02写道:

Hello ! After removing the meta method optimisation I've got it to compile again but now it fails here:

assert(c.sprintf(buf, "%d%g", false, 6.7) == 4 && ffi.string(buf) == '06.7');

Output of:

print(c.sprintf(buf, "%d%g", false, 6.7), ffi.string(buf) == '06.7')); 8 03.41612

I was passing before. And it still segfaults here:

assert(ffi.C.strncmp("two", "three", 3) ~= 0);

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454788921, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUi_NMyIHP-Bwsh7Vhv9EJIcGsdSBks5vDzDYgaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 14:01 qtiuto

I'm testing it on the device (nexus7) using termux.

mingodad avatar Jan 16 '19 14:01 mingodad

It should not make a difference but the compiler is clang7

mingodad avatar Jan 16 '19 14:01 mingodad

Hello qtiuto !

Here you have attached what I'm using to test your changes to luaffi, it's luaffib/raviffi with your changes but without the meta methods optimization.

The makefile maybe need some adjusts to work for you, as it is it doesn't work on x86 without removing -D__ANDROID_API__=25 from the CFLAGS.

I use it as is on my nexus7 inside termux (bash sell). Cheers ! luaffifb-arm.zip

mingodad avatar Jan 16 '19 15:01 mingodad

Please apply CHECK_ALIGN in ff.c firstly. It's the final fix for arm alignment. You have three argument before the double value in the the sprintf and it breaks the arm argument passing rule for double/int64. Apply CHECK_ALIGN and it will have the double value offset 4. If you use 'llx' instead of 'g', you will see the higher 4 bytes of the double value is now the lower 4 bytes. Then I will try termux to compile your work.

qtiuto avatar Jan 16 '19 16:01 qtiuto

@mingodad

qtiuto avatar Jan 16 '19 16:01 qtiuto

I have tested it on my phone by termux in arm32 mode and nothing goes wrong.

Domingo Alvarez Duarte [email protected] 于 2019年1月16日周三 23:20写道:

Hello qtiuto !

Here you have attached what I'm using to test your changes to luaffi, it's luaffib/raviffi with your changes but without the meta methods optimization.

The makefile maybe need some adjusts to work for you, as it is it doesn't work on x86 without removing -D__ANDROID_API__=25 from the CFLAGS.

I use it as is on my nexus7 inside termux (bash sell). Cheers ! luaffifb-arm.zip https://github.com/qtiuto/lua-for-android/files/2764706/luaffifb-arm.zip

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454817319, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUnoqZY0TubDkLBztOVcAVjsvCjdWks5vD0M6gaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 17:01 qtiuto

Hello ! I also just tested on a raspberry pi archlinux and all tests pass. But on my nexus7 this 'assert(ffi.C.strncmp("two", "three", 3) ~= 0);' still segfaults, I'll test on an old netbook running ubuntu x86 to see on 32bits.

mingodad avatar Jan 16 '19 18:01 mingodad

I think the error may be induce my mmap, which may fail on some devices with limited memory. I test it on my nano pi and it sometimes fails also.

Domingo Alvarez Duarte [email protected] 于 2019年1月17日周四 02:01写道:

Hello ! I also just tested on a raspberry pi archlinux and all tests pass. But on my nexus7 this 'assert(ffi.C.strncmp("two", "three", 3) ~= 0);' still segfaults, I'll test on an old netbook running ubuntu x86 to see on 32bits.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454878765, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUsCC7dXO6L5K1q8p5_6dhwnLWZ_sks5vD2kSgaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 18:01 qtiuto

Hello ! I just tested on the x86 netbook and all tests passed, now I'm trying on a nexus5 but I'm having small problems to get it working, later I'll report it, and maybe test on an OSX and on IOS

mingodad avatar Jan 16 '19 18:01 mingodad

I solve the problem on my nano pi by calling __builtin_clear_cache, but it's a gcc function. On linux, cacheflush is available. I'm not sure about the compatiblity on other platform. Windows cache has been flush actually.

Domingo Alvarez Duarte [email protected] 于 2019年1月17日周四 02:36写道:

Hello ! I just tested on the x86 netbook and all tests passed, now I'm trying on a nexus5 but I'm having small problems to get it working, later I'll report it, and maybe test on an OSX and on IOS

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454890409, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUs9Ry8d3-Aoo-Z61vwCL46-Eu3L8ks5vD3EYgaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 19:01 qtiuto

I just finished test on the nexus5 and all tests passed, on OSX also all tests passed, now I'm trying on an ipod5 ios8.1 jailbroken to see what happens.

mingodad avatar Jan 16 '19 19:01 mingodad

Hello ! Testing it on the iPOD iOS8.1 arm32 it compiles but gives the same error as before the patch for alignment:

print(c.sprintf(buf, '%g', 5.3), ffi.string(buf));
11	4.66726e-62

But all other tests passed.

LuaJIT 2.1 compiled but when try to run it trash the device, need reboot.

mingodad avatar Jan 16 '19 20:01 mingodad

replace %g with %llx and send me the result, OK?

Domingo Alvarez Duarte [email protected] 于 2019年1月17日周四 04:31写道:

Hello ! Testing it on the iPOD iOS8.1 arm32 it compiles but gives the same error as before the patch for alignment:

print(c.sprintf(buf, '%g', 5.3), ffi.string(buf)); 11 4.66726e-62

LuaJIT 2.1 compiled but when try to run it trash the device, need reboot.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454929150, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUjUbn0CvkftcCGzLJOVlbi10fGkGks5vD4wTgaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 20:01 qtiuto

Here you have:

lua test.lua 
Running test
11	4.66726e-62
16	3333333316390cdc
4	06.7
Test PASSED

Code changed to show the above output:

print(c.sprintf(buf, "%g", 5.3), ffi.string(buf))
print(c.sprintf(buf, "%llx", 5.3), ffi.string(buf))
--dad assert(c.sprintf(buf, "%g", 5.3) == 3 and ffi.string(buf) == '5.3')
assert(c.sprintf(buf, "%d", false) == 1 and ffi.string(buf) == '0')
print(c.sprintf(buf, "%d%g", false, 6.7), ffi.string(buf))

mingodad avatar Jan 16 '19 20:01 mingodad

Have you check_align for arm? If you do, the results seems like that the machine may read a double from unaligned address when my align check offsets 4. try fill a integer before to check the alignment.May be a right result will occur. If you can get a right result from that way, then I think I need to handle it specially.

Domingo Alvarez Duarte [email protected] 于 2019年1月17日周四 04:36写道:

Here you have:

lua test.lua Running test 11 4.66726e-62 16 3333333316390cdc 4 06.7 Test PASSED

Code changed to show the above output:

print(c.sprintf(buf, "%g", 5.3), ffi.string(buf)) print(c.sprintf(buf, "%llx", 5.3), ffi.string(buf)) --dad assert(c.sprintf(buf, "%g", 5.3) == 3 and ffi.string(buf) == '5.3') assert(c.sprintf(buf, "%d", false) == 1 and ffi.string(buf) == '0') print(c.sprintf(buf, "%d%g", false, 6.7), ffi.string(buf))

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454931068, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUoIjxggPge6XxOzFqlK1I_7GIbY7ks5vD41agaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 21:01 qtiuto

Hello ! I also isolate the code on one file to see if the interaction with the rest was the cause of the problem but no the problem remain the same:

local ffi = require("ffi")
ffi.cdef("int sprintf(char* buf, const char* format, ...);")

local buf = ffi.new('char[256]')

local c = ffi.C

print(c.sprintf(buf, "%g", 5.3), ffi.string(buf))
print(c.sprintf(buf, "%llx", 5.3), ffi.string(buf))

Output:

11	4.66726e-62
16	33333333181814a8

mingodad avatar Jan 16 '19 21:01 mingodad

Hello ! With what you've told me we get this:

local ffi = require("ffi")
ffi.cdef("int sprintf(char* buf, const char* format, ...);")

local buf = ffi.new('char[256]')

local c = ffi.C

print(c.sprintf(buf, "%d", 5), ffi.string(buf))
print(c.sprintf(buf, "%d:%g", 5, 5.3), ffi.string(buf))
print(c.sprintf(buf, "%g", 5.3), ffi.string(buf))
print(c.sprintf(buf, "%llx", 5.3), ffi.string(buf))

Output:

1	5
5	5:5.3
11	4.66726e-62
16	3333333317043eb4

mingodad avatar Jan 16 '19 21:01 mingodad

And here with more examples:

local ffi = require("ffi")
ffi.cdef("int sprintf(char* buf, const char* format, ...);")

local buf = ffi.new('char[256]')

local c = ffi.C

print(c.sprintf(buf, "%d", 5), ffi.string(buf))
print(c.sprintf(buf, "%d:%g:%g", 5, 5.3, 6.7), ffi.string(buf))
print(c.sprintf(buf, "%g", 5.3), ffi.string(buf))
print(c.sprintf(buf, "%llx", 5.3), ffi.string(buf))
print(c.sprintf(buf, "%g", 6.7), ffi.string(buf))
print(c.sprintf(buf, "%d:%g:%d", 11, 6.7, 22), ffi.string(buf))

Output:

1	5
9	5:5.3:6.7
11	4.66726e-62
16	33333333153806c0
12	-9.25596e+61
9	11:6.7:22

It seems that you are getting close to the problem .

mingodad avatar Jan 16 '19 21:01 mingodad

I can make sure that this a compiler bug or a library for the platform. The stack doesn't align eight and and the library function var_arg doesn't apply arm argument passing rule and do it as usual like x86. The platform should be handle specially or the gcc version should be handle specially. Any macro defines the platform? @mingodad

qtiuto avatar Jan 16 '19 21:01 qtiuto

Just exclude the platform from checking alignment and every thing goes right.

qtiuto avatar Jan 16 '19 21:01 qtiuto

I think you can work it out for I'm not familiar with ios macros.

Domingo Alvarez Duarte [email protected] 于 2019年1月17日周四 05:10写道:

And here with more examples:

local ffi = require("ffi") ffi.cdef("int sprintf(char* buf, const char* format, ...);")

local buf = ffi.new('char[256]')

local c = ffi.C

print(c.sprintf(buf, "%d", 5), ffi.string(buf)) print(c.sprintf(buf, "%d:%g:%g", 5, 5.3, 6.7), ffi.string(buf)) print(c.sprintf(buf, "%g", 5.3), ffi.string(buf)) print(c.sprintf(buf, "%llx", 5.3), ffi.string(buf)) print(c.sprintf(buf, "%g", 6.7), ffi.string(buf)) print(c.sprintf(buf, "%d:%g:%d", 11, 6.7, 22), ffi.string(buf))

Output:

1 5 9 5:5.3:6.7 11 4.66726e-62 16 33333333153806c0 12 -9.25596e+61 9 11:6.7:22

It seems that you are getting close to the problem .

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454942846, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUuuSlE_-oyw_EU7QeZNXEw-QdAJzks5vD5VJgaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 21:01 qtiuto

Here is the assembler generated by this c program:

#include <stdio.h>

int main(int argc, char *argv[])
{
    double d1 = 5.3;
    double d2 = 6.7;
    float f1 = 5.3;
    float f2 = 6.7;
    char buf[256];
    int rc;
    rc = sprintf(buf, "%g", d1);
    printf("%d\t%s\n", rc, buf);
    rc = sprintf(buf, "%g", d2);
    printf("%d\t%s\n", rc, buf);
    rc = sprintf(buf, "%g", f1);
    printf("%d\t%s\n", rc, buf);
    rc = sprintf(buf, "%g", f2);
    printf("%d\t%s\n", rc, buf);
    
    return 0;
}
	.section	__TEXT,__text,regular,pure_instructions
	.ios_version_min 5, 0
	.syntax unified
	.globl	_main
	.align	1
	.code	16                      @ @main
	.thumb_func	_main
_main:
@ BB#0:
	push	{r4, r5, r6, r7, lr}
	add	r7, sp, #12
	push.w	{r8, r10, r11}
	sub	sp, #268
	movw	r4, :lower16:(L_.str-(LPC0_0+4))
	movw	r10, #13107
	movt	r4, :upper16:(L_.str-(LPC0_0+4))
	movw	r8, :lower16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_1+4))
	movt	r8, :upper16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_1+4))
LPC0_0:
	add	r4, pc
LPC0_1:
	add	r8, pc
	add	r5, sp, #8
	movt	r10, #16405
	mov.w	r0, #858993459
	ldr.w	r8, [r8]
	movs	r1, #0
	mov.w	r2, #256
	mov	r3, r4
	ldr.w	r8, [r8]
	str.w	r8, [sp, #264]
	strd	r0, r10, [sp]
	mov	r0, r5
	blx	___sprintf_chk
	movw	r6, :lower16:(L_.str.1-(LPC0_2+4))
	mov	r1, r0
	movt	r6, :upper16:(L_.str.1-(LPC0_2+4))
	mov	r2, r5
LPC0_2:
	add	r6, pc
	mov	r0, r6
	blx	_printf
	movw	r11, #52428
	movw	r0, #52429
	movt	r11, #16410
	movt	r0, #52428
	strd	r0, r11, [sp]
	mov	r0, r5
	movs	r1, #0
	mov.w	r2, #256
	mov	r3, r4
	blx	___sprintf_chk
	mov	r1, r0
	mov	r0, r6
	mov	r2, r5
	blx	_printf
	mov.w	r0, #1073741824
	movs	r1, #0
	strd	r0, r10, [sp]
	mov	r0, r5
	mov.w	r2, #256
	mov	r3, r4
	blx	___sprintf_chk
	mov	r1, r0
	mov	r0, r6
	mov	r2, r5
	blx	_printf
	mov.w	r0, #-1073741824
	movs	r1, #0
	strd	r0, r11, [sp]
	mov	r0, r5
	mov.w	r2, #256
	mov	r3, r4
	blx	___sprintf_chk
	mov	r1, r0
	mov	r0, r6
	mov	r2, r5
	blx	_printf
	ldr	r0, [sp, #264]
	subs.w	r0, r8, r0
	itttt	eq
	moveq	r0, #0
	addeq	sp, #268
	popeq.w	{r8, r10, r11}
	popeq	{r4, r5, r6, r7, pc}
	blx	___stack_chk_fail

	.section	__TEXT,__cstring,cstring_literals
L_.str:                                 @ @.str
	.asciz	"%g"

L_.str.1:                               @ @.str.1
	.asciz	"%d\t%s\n"


	.section	__DATA,__nl_symbol_ptr,non_lazy_symbol_pointers
	.align	2
L___stack_chk_guard$non_lazy_ptr:
	.indirect_symbol	___stack_chk_guard
	.long	0

.subsections_via_symbols

mingodad avatar Jan 16 '19 21:01 mingodad

Can you test whether the problem only happen s on variadic function? I'm not sure if general argument passing needs alignment for ios or not. If not, I think the dasc file need a little fix also. You can define a function with a int and a double as argument and a function with two ints and a double as argument to check whether you can receive right argments.

奥斯陆君王 [email protected] 于 2019年1月17日周四 05:17写道:

I think you can work it out for I'm not familiar with ios macros.

Domingo Alvarez Duarte [email protected] 于 2019年1月17日周四 05:10写道:

And here with more examples:

local ffi = require("ffi") ffi.cdef("int sprintf(char* buf, const char* format, ...);")

local buf = ffi.new('char[256]')

local c = ffi.C

print(c.sprintf(buf, "%d", 5), ffi.string(buf)) print(c.sprintf(buf, "%d:%g:%g", 5, 5.3, 6.7), ffi.string(buf)) print(c.sprintf(buf, "%g", 5.3), ffi.string(buf)) print(c.sprintf(buf, "%llx", 5.3), ffi.string(buf)) print(c.sprintf(buf, "%g", 6.7), ffi.string(buf)) print(c.sprintf(buf, "%d:%g:%d", 11, 6.7, 22), ffi.string(buf))

Output:

1 5 9 5:5.3:6.7 11 4.66726e-62 16 33333333153806c0 12 -9.25596e+61 9 11:6.7:22

It seems that you are getting close to the problem .

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454942846, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUuuSlE_-oyw_EU7QeZNXEw-QdAJzks5vD5VJgaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 21:01 qtiuto

The compiler doesn't work wrong. It 's the error from the receiver. It doesn't check stack alignment which will be done by other arm platform. Unfortunately, the stack doesn't align eight for some unkown functions and have the problem occur. I'm not willing to generate extra code to check the stack.

Domingo Alvarez Duarte [email protected] 于 2019年1月17日周四 05:24写道:

Here is the assembler generated by this c program:

#include <stdio.h>

int main(int argc, char *argv[]) { double d1 = 5.3; double d2 = 6.7; float f1 = 5.3; float f2 = 6.7; char buf[256]; int rc; rc = sprintf(buf, "%g", d1); printf("%d\t%s\n", rc, buf); rc = sprintf(buf, "%g", d2); printf("%d\t%s\n", rc, buf); rc = sprintf(buf, "%g", f1); printf("%d\t%s\n", rc, buf); rc = sprintf(buf, "%g", f2); printf("%d\t%s\n", rc, buf);

return 0;

}

.section __TEXT,__text,regular,pure_instructions .ios_version_min 5, 0 .syntax unified .globl _main .align 1 .code 16 @ @main .thumb_func main main: @ BB#0: push {r4, r5, r6, r7, lr} add r7, sp, #12 push.w {r8, r10, r11} sub sp, #268 movw r4, :lower16:(L.str-(LPC0_0+4)) movw r10, #13107 movt r4, :upper16:(L.str-(LPC0_0+4)) movw r8, :lower16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_1+4)) movt r8, :upper16:(L___stack_chk_guard$non_lazy_ptr-(LPC0_1+4)) LPC0_0: add r4, pc LPC0_1: add r8, pc add r5, sp, #8 movt r10, #16405 mov.w r0, #858993459 ldr.w r8, [r8] movs r1, #0 mov.w r2, #256 mov r3, r4 ldr.w r8, [r8] str.w r8, [sp, #264] strd r0, r10, [sp] mov r0, r5 blx _sprintf_chk movw r6, :lower16:(L.str.1-(LPC0_2+4)) mov r1, r0 movt r6, :upper16:(L.str.1-(LPC0_2+4)) mov r2, r5 LPC0_2: add r6, pc mov r0, r6 blx _printf movw r11, #52428 movw r0, #52429 movt r11, #16410 movt r0, #52428 strd r0, r11, [sp] mov r0, r5 movs r1, #0 mov.w r2, #256 mov r3, r4 blx ___sprintf_chk mov r1, r0 mov r0, r6 mov r2, r5 blx _printf mov.w r0, #1073741824 movs r1, #0 strd r0, r10, [sp] mov r0, r5 mov.w r2, #256 mov r3, r4 blx ___sprintf_chk mov r1, r0 mov r0, r6 mov r2, r5 blx _printf mov.w r0, #-1073741824 movs r1, #0 strd r0, r11, [sp] mov r0, r5 mov.w r2, #256 mov r3, r4 blx ___sprintf_chk mov r1, r0 mov r0, r6 mov r2, r5 blx _printf ldr r0, [sp, #264] subs.w r0, r8, r0 itttt eq moveq r0, #0 addeq sp, #268 popeq.w {r8, r10, r11} popeq {r4, r5, r6, r7, pc} blx ___stack_chk_fail

.section __TEXT,_cstring,cstring_literals L.str: @ @.str .asciz "%g"

L_.str.1: @ @.str.1 .asciz "%d\t%s\n"

.section __DATA,__nl_symbol_ptr,non_lazy_symbol_pointers .align 2 L___stack_chk_guard$non_lazy_ptr: .indirect_symbol ___stack_chk_guard .long 0

.subsections_via_symbols

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454947804, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUkWOoglnfnIjNDCtbgyLiU_ub8DPks5vD5ilgaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 21:01 qtiuto

I'm not sure I understand what you are saying:

#include <stdio.h>

void func1(int i1, double d1)
{
    printf("%d : %g\n", i1, d1);
}

void func2(int i1, int i2, double d1)
{
    printf("%d : %d : %g\n", i1, i2, d1);
}

int main(int argc, char *argv[])
{
    double d1 = 5.3;
    int i1 = 2;
    int i2 = 4;
    
    func1(i1, d1);
    func2(i1, i2, d1);
    
    return 0;
}
	.section	__TEXT,__text,regular,pure_instructions
	.ios_version_min 5, 0
	.syntax unified
	.globl	_func1
	.align	1
	.code	16                      @ @func1
	.thumb_func	_func1
_func1:
@ BB#0:
	push	{r7, lr}
	mov	r7, sp
	mov	r3, r2
	mov	r2, r1
	mov	r1, r0
	movw	r0, :lower16:(L_.str-(LPC0_0+4))
	movt	r0, :upper16:(L_.str-(LPC0_0+4))
LPC0_0:
	add	r0, pc
	blx	_printf
	pop	{r7, pc}

	.globl	_func2
	.align	1
	.code	16                      @ @func2
	.thumb_func	_func2
_func2:
@ BB#0:
	push	{r7, lr}
	mov	r7, sp
	sub	sp, #4
	mov	r9, r2
	mov	r2, r1
	mov	r1, r0
	movw	r0, :lower16:(L_.str.1-(LPC1_0+4))
	movt	r0, :upper16:(L_.str.1-(LPC1_0+4))
	str	r3, [sp]
LPC1_0:
	add	r0, pc
	mov	r3, r9
	blx	_printf
	add	sp, #4
	pop	{r7, pc}

	.globl	_main
	.align	3
	.code	16                      @ @main
	.thumb_func	_main
_main:
@ BB#0:
	push	{r4, r5, r7, lr}
	add	r7, sp, #8
	sub	sp, #4
	vldr	d16, LCPI2_0
	movw	r0, :lower16:(L_.str-(LPC2_0+4))
	movt	r0, :upper16:(L_.str-(LPC2_0+4))
	movs	r1, #2
	vmov	r4, r5, d16
LPC2_0:
	add	r0, pc
	mov	r2, r4
	mov	r3, r5
	blx	_printf
	movw	r0, :lower16:(L_.str.1-(LPC2_1+4))
	movs	r1, #2
	movt	r0, :upper16:(L_.str.1-(LPC2_1+4))
	movs	r2, #4
LPC2_1:
	add	r0, pc
	mov	r3, r4
	str	r5, [sp]
	blx	_printf
	movs	r0, #0
	add	sp, #4
	pop	{r4, r5, r7, pc}
	.align	3
@ BB#1:
	.data_region
LCPI2_0:
	.long	858993459               @ double 5.2999999999999998
	.long	1075131187
	.end_data_region

	.section	__TEXT,__cstring,cstring_literals
L_.str:                                 @ @.str
	.asciz	"%d : %g\n"

L_.str.1:                               @ @.str.1
	.asciz	"%d : %d : %g\n"


.subsections_via_symbols

mingodad avatar Jan 16 '19 21:01 mingodad

Here is a sample with a variadic function:

#include <stdio.h>
#include <stdarg.h>

void func1(int i1, double d1)
{
    printf("%d : %g\n", i1, d1);
}

void func2(int i1, int i2, double d1)
{
    printf("%d : %d : %g\n", i1, i2, d1);
}

void func3(char *buf, const char *fmt, ...)
{
    double d1 = 0;
    va_list args;
    va_start(args, fmt);
    d1 = va_arg(args, double);
    va_end(args);
    printf("%g\n", d1);
}

int main(int argc, char *argv[])
{
    double d1 = 5.3;
    int i1 = 2;
    int i2 = 4;
    char buf[256];
    
    func1(i1, d1);
    func2(i1, i2, d1);
    func3(buf, "%g", d1);
    
    return 0;
}
	.section	__TEXT,__text,regular,pure_instructions
	.ios_version_min 5, 0
	.syntax unified
	.globl	_func1
	.align	1
	.code	16                      @ @func1
	.thumb_func	_func1
_func1:
@ BB#0:
	push	{r7, lr}
	mov	r7, sp
	mov	r3, r2
	mov	r2, r1
	mov	r1, r0
	movw	r0, :lower16:(L_.str-(LPC0_0+4))
	movt	r0, :upper16:(L_.str-(LPC0_0+4))
LPC0_0:
	add	r0, pc
	blx	_printf
	pop	{r7, pc}

	.globl	_func2
	.align	1
	.code	16                      @ @func2
	.thumb_func	_func2
_func2:
@ BB#0:
	push	{r7, lr}
	mov	r7, sp
	sub	sp, #4
	mov	r9, r2
	mov	r2, r1
	mov	r1, r0
	movw	r0, :lower16:(L_.str.1-(LPC1_0+4))
	movt	r0, :upper16:(L_.str.1-(LPC1_0+4))
	str	r3, [sp]
LPC1_0:
	add	r0, pc
	mov	r3, r9
	blx	_printf
	add	sp, #4
	pop	{r7, pc}

	.globl	_func3
	.align	1
	.code	16                      @ @func3
	.thumb_func	_func3
_func3:
@ BB#0:
	sub	sp, #8
	push	{r7, lr}
	mov	r7, sp
	sub	sp, #4
	add.w	r0, r7, #8
	strd	r2, r3, [r7, #8]
	str	r0, [sp]
	adds	r0, #8
	str	r0, [sp]
	vldr	d16, [r7, #8]
	movw	r0, :lower16:(L_.str.2-(LPC2_0+4))
	movt	r0, :upper16:(L_.str.2-(LPC2_0+4))
	vmov	r1, r2, d16
LPC2_0:
	add	r0, pc
	blx	_printf
	add	sp, #4
	pop.w	{r7, lr}
	add	sp, #8
	bx	lr

	.globl	_main
	.align	3
	.code	16                      @ @main
	.thumb_func	_main
_main:
@ BB#0:
	push	{r4, r5, r7, lr}
	add	r7, sp, #8
	sub	sp, #4
	vldr	d16, LCPI3_0
	movw	r0, :lower16:(L_.str-(LPC3_0+4))
	movt	r0, :upper16:(L_.str-(LPC3_0+4))
	movs	r1, #2
	vmov	r4, r5, d16
LPC3_0:
	add	r0, pc
	mov	r2, r4
	mov	r3, r5
	blx	_printf
	movw	r0, :lower16:(L_.str.1-(LPC3_1+4))
	movs	r1, #2
	movt	r0, :upper16:(L_.str.1-(LPC3_1+4))
	movs	r2, #4
LPC3_1:
	add	r0, pc
	mov	r3, r4
	str	r5, [sp]
	blx	_printf
	mov	r2, r4
	mov	r3, r5
	bl	_func3
	movs	r0, #0
	add	sp, #4
	pop	{r4, r5, r7, pc}
	.align	3
@ BB#1:
	.data_region
LCPI3_0:
	.long	858993459               @ double 5.2999999999999998
	.long	1075131187
	.end_data_region

	.section	__TEXT,__cstring,cstring_literals
L_.str:                                 @ @.str
	.asciz	"%d : %g\n"

L_.str.1:                               @ @.str.1
	.asciz	"%d : %d : %g\n"

L_.str.2:                               @ @.str.2
	.asciz	"%g\n"


.subsections_via_symbols

mingodad avatar Jan 16 '19 21:01 mingodad

Thanks for test. I can make sure that no alignment is applied on ios. Then, you just need to fix two places. The first is CHECK_ALIGN in unpack_vararg and add &&!defined(TARGET_OS_IPHONE) for it. The second is the ALIGNED macro in call_arm.dasc. make it #define ALIGNED(x,align) 1 for TARGET_OS_IPHONE. Or you can see them from my lastest commit.

Domingo Alvarez Duarte [email protected] 于 2019年1月17日周四 05:39写道:

I'm not sure I understand what you are saying:

#include <stdio.h>

void func1(int i1, double d1) { printf("%d : %g\n", i1, d1); }

void func2(int i1, int i2, double d1) { printf("%d : %d : %g\n", i1, i2, d1); }

int main(int argc, char *argv[]) { double d1 = 5.3; int i1 = 2; int i2 = 4;

func1(i1, d1);
func2(i1, i2, d1);

return 0;

}

.section __TEXT,__text,regular,pure_instructions .ios_version_min 5, 0 .syntax unified .globl _func1 .align 1 .code 16 @ @func1 .thumb_func func1 func1: @ BB#0: push {r7, lr} mov r7, sp mov r3, r2 mov r2, r1 mov r1, r0 movw r0, :lower16:(L.str-(LPC0_0+4)) movt r0, :upper16:(L.str-(LPC0_0+4)) LPC0_0: add r0, pc blx _printf pop {r7, pc}

.globl _func2 .align 1 .code 16 @ @func2 .thumb_func func2 func2: @ BB#0: push {r7, lr} mov r7, sp sub sp, #4 mov r9, r2 mov r2, r1 mov r1, r0 movw r0, :lower16:(L.str.1-(LPC1_0+4)) movt r0, :upper16:(L.str.1-(LPC1_0+4)) str r3, [sp] LPC1_0: add r0, pc mov r3, r9 blx _printf add sp, #4 pop {r7, pc}

.globl main .align 3 .code 16 @ @main .thumb_func main main: @ BB#0: push {r4, r5, r7, lr} add r7, sp, #8 sub sp, #4 vldr d16, LCPI2_0 movw r0, :lower16:(L.str-(LPC2_0+4)) movt r0, :upper16:(L.str-(LPC2_0+4)) movs r1, #2 vmov r4, r5, d16 LPC2_0: add r0, pc mov r2, r4 mov r3, r5 blx printf movw r0, :lower16:(L.str.1-(LPC2_1+4)) movs r1, #2 movt r0, :upper16:(L.str.1-(LPC2_1+4)) movs r2, #4 LPC2_1: add r0, pc mov r3, r4 str r5, [sp] blx _printf movs r0, #0 add sp, #4 pop {r4, r5, r7, pc} .align 3 @ BB#1: .data_region LCPI2_0: .long 858993459 @ double 5.2999999999999998 .long 1075131187 .end_data_region

.section __TEXT,_cstring,cstring_literals L.str: @ @.str .asciz "%d : %g\n"

L_.str.1: @ @.str.1 .asciz "%d : %d : %g\n"

.subsections_via_symbols

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/qtiuto/lua-for-android/issues/6#issuecomment-454952965, or mute the thread https://github.com/notifications/unsubscribe-auth/AJHwUgUL_gVjreYh3lrgJjef0H29k_tjks5vD5wBgaJpZM4aB3fT .

qtiuto avatar Jan 16 '19 21:01 qtiuto