Jan Hubicka wrote on 11.07.2007 02:02:13: > > > > > > I am on that tricky thing ;) I think I need in i386.c an global variable > > > "ix86_amd64_abi" which helds the the current function abi. This > means also > > > that I have to use instead of TARGET_64BIT_MS_ABI this variable.This var > > > may initioalized by init_cumulative_args and the overriden > > > REG_PARM_STACK_SPACE, OUTGOING_REG_PARM_STACK_SPACE, REGPARM_MAX, > > > SSE_REGPARM_MAX, STACK_BOUNDARY, etc. > > > > In order to get all cases right (ie switching ABIs and calling foreign > > function), you need more bookkeeping than this. I am just in hurry to > > catch bus, but I will send you little guide tonight. > > Hi, > so short overview. It seems to me that you have several cases: > > - to keep track of current function ABI, you need to add struct > machine_function field (i386.g) and update TARGET_64BIT_MS_ABI that > cares about current function ABI accordingly. > > To deal correclty with call_used registers, I think you need to set > the bits at same time machine_function is initialized and add a > function to regalloc that will update the internal representaiton via > regset (grep for use of the macro). > > For example prologue/epologue code cares about this current ABI. > > - to keep track of ABI used by currently expanded function call > CUMULATIVE_ARGS allows you to add extra info. See how cum->nregs > is handled, you need to do pretty much the same and add cum argument > to functions called form cumulative arguments machinery where youneed them. > (as opposed to flipping the current abi above as you suggested). > > There is one problem that RTL CALL instructions does not specify call > used registers that differ in between ABI. They are all assumed to > use ones specified by call_used. > > I think you can't do anything to declare SI/DI unused when calling > function from SYSV ABI with MS ABI convention. We just lose code > quality a bit. > > On the other hand you must specify them as clobbered when calling > SYSV ABI from MS ABI. This needs to be done by adding extra variants > of call instruction pattern with the clobber. You might want to > impleement SYSV->MS direction only first and not worry about this for > start. > > Note that when calling libcalls, you always want to use the efault > conventions so the libgcc match. > > - You need to keep track of cases function from one ABI calls functions > from different ABI. This can be done by adding yet another bit into > machine_function and simply set it when expanding the foreign call. > > Some predicates (such as ix86_function_value_regno_p) cares about > if the reg can possibly be return value. In the case both ABIs > coexist in single function, you need to be conservative here and > merge both possibilities. > > - You will need to update the calling convention of some of the > predicates you mentioned (such as I think OUTGOING_REG_PARM_STACK_SPACE) > to specify the function declaration they care about (so you know if > it is foreign call or not). GCC middleend is probably not quite > ready to deal with so different ABIs intermixed at once. This > include updating of calling conventions in all ports and should be > done first by separate patches. Not dificult, but tedious. > > I guess thats it. I believe that if you don't do something of the > above, some of cases will go wildly wrong... (this is not to discougrate > you, just to explain why it is tricky :) > > Honza
I thank you very much for your great help. Currently I am stucked on x86_function_value_regno_p (macro FUNCTION_VALUE_REGNO_P). It is not clear what's to do here for the FIRST_FLOAT_REG case. Maybe I could use the ms_abi variant for sysv_abi as default too. But I think, it breaks 87 fpu stuff for this ABI !?! Cheers, i.A. Kai Tietz | (\_/) This is Bunny. Copy and paste Bunny | (='.'=) into your signature to help him gain | (")_(") world domination. ------------------------------------------------------------------------------------------ OneVision Software Entwicklungs GmbH & Co. KG Dr.-Leo-Ritter-Straße 9 - 93049 Regensburg Tel: +49.(0)941.78004.0 - Fax: +49.(0)941.78004.489 - www.OneVision.com Commerzbank Regensburg - BLZ 750 400 62 - Konto 6011050 Handelsregister: HRA 6744, Amtsgericht Regensburg Komplementärin: OneVision Software Entwicklungs Verwaltungs GmbH Dr.-Leo-Ritter-Straße 9 – 93049 Regensburg Handelsregister: HRB 8932, Amtsgericht Regensburg - Geschäftsführer: Ulrike Döhler, Manuela Kluger