mirror of
https://github.com/ipxe/ipxe
synced 2025-12-14 07:50:43 +03:00
Import various libgcc functions from syslinux.
Experimentation reveals that gcc ignores -mrtd for the implicit arithmetic functions (e.g. __udivdi3), but not for the implicit memcpy() and memset() functions. Mark the implicit arithmetic functions with __attribute__((cdecl)) to compensate for this. (Note: we cannot mark with with __cdecl, because we define __cdecl to incorporate regparm(0) as well.)
This commit is contained in:
26
src/libgcc/libgcc.h
Normal file
26
src/libgcc/libgcc.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef _LIBGCC_H
|
||||
#define _LIBGCC_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/*
|
||||
* It seems as though gcc expects its implicit arithmetic functions to
|
||||
* be cdecl, even if -mrtd is specified. This is somewhat
|
||||
* inconsistent; for example, if -mregparm=3 is used then the implicit
|
||||
* functions do become regparm(3).
|
||||
*
|
||||
* The implicit calls to memcpy() and memset() which gcc can generate
|
||||
* do not seem to have this inconsistency; -mregparm and -mrtd affect
|
||||
* them in the same way as any other function.
|
||||
*
|
||||
*/
|
||||
#define LIBGCC __attribute__ (( cdecl ))
|
||||
|
||||
extern LIBGCC uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem);
|
||||
extern LIBGCC uint64_t __udivdi3(uint64_t num, uint64_t den);
|
||||
extern LIBGCC uint64_t __umoddi3(uint64_t num, uint64_t den);
|
||||
extern LIBGCC int64_t __divdi3(int64_t num, int64_t den);
|
||||
extern LIBGCC int64_t __moddi3(int64_t num, int64_t den);
|
||||
|
||||
#endif /* _LIBGCC_H */
|
||||
Reference in New Issue
Block a user