'naked' keyword

Don nospam at nospam.com
Wed Jan 7 12:09:57 PST 2009


Tomas Lindquist Olsen wrote:
> On Wed, Jan 7, 2009 at 12:41 PM, Don <nospam at nospam.com 
> <mailto:nospam at nospam.com>> wrote:
> 
>     Tomas Lindquist Olsen wrote:
> 
>         On Fri, Jan 2, 2009 at 9:21 AM, Don <nospam at nospam.com
>         <mailto:nospam at nospam.com> <mailto:nospam at nospam.com
>         <mailto:nospam at nospam.com>>> wrote:
> 
>            Duane Bailey wrote:
> 
>                I am currently porting LDC  to PowerPC and, hopefully,
>                eventually the POWER and CELL platforms as well. The
>         first bit
>                requires me to port the inline assembler, allowing me to
> 
>            review the problems that the D language presents LLVM.
>            Cool!!!!
> 
> 
> 
>                LLVM is not a toy virtual machine. It is, perhaps, the most
>                flexible and powerful compiler toolset ever, spanning massive
>                numbers of computing platforms. It even supports (in a
>         limited
>                manner) the PIC16 platform, require insane constraints: there
>                are no registers, memory can only be accessed in one byte
>                amounts, and some processors only have 35 instructions.
> 
> 
>            That's pretty impressive. I'm currently using a PIC, but it's so
>            memory-limited it's hard to believe D ever being workable on it.
> 
> 
>                LLVM, however, is not able to do everything. For some reason,
>                its current API does not allow the restriction of
>         prologue and
>                epilogue generation; to allow so would not make sense:  the
>                language itself depends on the maintenance of the stack. The
>                only way to establish a 'naked' function in *c* is to
>         'omit' the
>                frame pointer—technically not allowed in most OS's
>         ABIs—and then
>                explicitly avoid using all variables (and hence the
>         stack), OR
>                to use top level assembly to write the assembly yourself.
> 
>                Now, neither of those options are really what D should
>         use, but
>                I have some other recommendations based on this. 'naked'
>                functions should not be allowed to have any D, except to
>                reference arguments passed to it. In other words, it
>         should not
>                touch the stack. in fact, there's really no reason at all to
>                have the 'naked' statement in the inline assembly. It's
>         not  a
>                property of the assembly, it's a property of the
>         *function*. And
>                because D code should not be used (except perhaps for
>         macros?),
>                'naked' functions should intrinsically be assembly functions.
> 
> 
>            I agree with this. Mixing run-time D and naked asm doesn't
>         make any
>            sense. But, something which I've done which is _very_ useful
>         is to
>            mixin CTFE functions. You get something like:
> 
>            void foo() {
>             asm {
>             naked;
>             }
>             mixin(someasm("EBX")); // becomes asm {mov EAX, EBX; }
>             asm { ret; }
>            }
> 
>            char [] someasm(char [] c) {
>             return "asm { mov EAX," ~ c ~"; }";
>            }
> 
>            I see this as crucial functionality since it gives you an
>            unbelievably powerful macro language in the assembler.
> 
> 
>         it should be no problem to merge asm blocks in a function, the
>         only problem is mixing normal dcode in there as well.
>         I've decided to make this an error in LDC since there is no
>         sensible way to implement D-style function parameters *and* make
>         sure the function really is naked. function parameters in llvm
>         are ssa values, so you manually have to alloca a stack slot and
>         copy the argument into that to make sure the parameter is an l-value
> 
> 
>     I don't understand those last two sentences. Does it mean that you'd
>     only allow 'naked' on extern(C) functions? Or only that mixing D and
>     naked asm would be illegal?
> 
> 
> Sorry, I can see I was a bit unclear. All I meant was that I can't 
> sensibly implement naked and allow arbitrary D code in the mix as well, 
> it's either or... naked should eventually work fine for any calling 
> conventions, it'll just bail out with an error if you try and mix D in 
> between the asm blocks.
>  
> 
> 
>     By the way, in DMD, mixing naked and D code only works if you put a
>     "push EBP; mov   EBP, ESP;" before the first bit of D code, which
>     isn't documented anywhere as far as I know; and I don't know how to
>     make inner functions work. So it's pretty much unspecified behaviour
>     right now.
> 
> 
> nested delegates inside naked functions pose some problems, since they 
> will modify the stack frame as well (like allowing full access to 
> function parameters, like taking the address of one, which was what I 
> was trying to talk about in my reply)
> 
> Consider taking the address of a parameter that is passed by value in 
> EAX, this will allocate a stack slot...
> 
> Hope I was a bit more clear this time :)

Yes. And that's awesome! It means my existing Bigint naked asm code in 
Tango should work on LDC without modification.



More information about the Digitalmars-d mailing list