|
Message-ID: <56F9B890.9010409@gmail.com> Date: Tue, 29 Mar 2016 10:04:48 +1100 From: Patrick Oppenlander <pattyo.lists@...il.com> To: musl@...ts.openwall.com Subject: Re: [PATCH 2/2] add powerpc64 port On 29/03/16 09:10, Rich Felker wrote: > On Tue, Mar 29, 2016 at 09:00:19AM +1100, Patrick Oppenlander wrote: >> On 28/03/16 10:37, Rich Felker wrote: >>> This is kind of the reason why I was hesitant to add .S support for so >>> long. :-) >>> >>> I don't want to reject it outright, but the idea of adding .S support >>> was just to allow conditional compilation, not to do condensed >>> assembly sources that require macro expansion. I can see where the >>> code might be unwieldy without this though. Anyone else have opinions? >> IMHO .S support is worthwhile just to be able to use constant >> definitions in assembly. >> >> For example, >> >> __unmapself: >> mov r7,#SYS_munmap >> svc 0 >> mov r7,#SYS_exit >> svc 0 >> >> Is a clearer than: >> >> __unmapself: >> mov r7,#91 >> svc 0 >> mov r7,#1 >> svc 0 >> >> Especially when approaching the source for the first time. > Are there any asm source files making syscalls where it's not obvious > from the public contract for the function(s) being implemented which > syscall they're making? I think it's just as easy to add a comment > with the syscall name if it's unclear, and then the actual number is > present too which is nice because it matches the dissembly. I guess the reason I chose that particular example because it was one of my recent pain points porting musl to a small embedded RTOS. A comment would probably have been sufficient -- at least then 'grep' would have found it. > The time when it would actually improve things to have symbolic > constants in asm files is for places where the constant can actually > vary, e.g. due to being derived from an offset in an implementation > internal structure or such (like struct __pthread). But preprocessor > macros cannot represent that in asm source files anyway. :( I have seen a solution to this problem. Can't exactly remember where but the gist of it was to hack some gcc inline assembly together to generate the required offset constants: test.c: struct test { int a; int b; }; #define offset(def, struct, member) \ __asm__("\n#define " def " %0" :: "i" (__builtin_offsetof(struct, member))) void offsets(void) { offset("A_OFFSET", struct test, a); offset("B_OFFSET", struct test, b); } compile with gcc -S test.c to generate test.s: .file "test.c" .text .globl offsets .type offsets, @function offsets: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 #APP # 11 "test.c" 1 #define A_OFFSET $0 # 0 "" 2 # 12 "test.c" 1 #define B_OFFSET $4 # 0 "" 2 #NO_APP nop popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size offsets, .-offsets .ident "GCC: (GNU) 5.3.0" .section .note.GNU-stack,"",@progbits pull out the #defines with sed -ne '/^#define/ s/\$// p' test.s #define A_OFFSET 0 #define B_OFFSET 4 Somewhat grotesque, but it works. Patrick
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.