[llvm-commits] [WinABI patch] Make sure to call __chkstk when appropriate
Anton Korobeynikov
asl at math.spbu.ru
Wed Aug 18 03:56:13 PDT 2010
Hello, Cameron
> I put it in the same area as the mingw case, for __alloca, so I thought it
> was in the right place.
Hrm... Doesn't seem so. Stuff really should be done inside emitPrologue(),
not within some helper routine.
> You're right it will clobber eax in the 32-bit case, so there'd have to be
> some code added to save/restore it.
emitPrologue() already handles this case for __alloca, no need to code
duplication,
you'll just have to tune the name there.
> I'll have to take your word that __chkstk is the same as __alloca, but
> reading the documentation on Microsoft's website, it doesn't come across
> that way:
> __alloca:
>
> Allocates memory on the stack. This function is deprecated because a more
> secure version is available; see _malloca.
MS __alloca != mingw32 __alloca
> The __chkstk helper will not modify any registers other than R10, R11, and
> the condition codes. In particular, it will return RAX unchanged and leave
> all nonvolatile registers and argument-passing registers unmodified.
>
> So, the only registers which are munged, in the 64-bit case, are the
> volatile ones. I assumed that the 32-bit case would be similar.
There is one point
> The reason I didn't add this code to the mingw case is because that path
> never calls emitSPUpdate(): it relys on __alloca to do all the stack
> manipulation. This didn't appear to me that it would be valid, according
> to the Windows ABI.
It definitely does all the stack manipulations, see above. I'm not quite sure
about 64 bit case. I vague recall some discussion on gcc ML, that on 64 bit
__chkstk != __alloca
--
With best regards, Anton Korobeynikov
Faculty of Mathematics and Mechanics, Saint Petersburg State University
More information about the llvm-commits
mailing list