Skip to content

Commit

Permalink
[libgcc] Make __libgcc architecture-specific
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Brown committed Nov 19, 2008
1 parent dc60c24 commit 849e4b1
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 23 deletions.
14 changes: 14 additions & 0 deletions src/arch/i386/include/bits/compiler.h
Expand Up @@ -6,6 +6,20 @@
/** Declare a function with standard calling conventions */
#define __asmcall __attribute__ (( cdecl, regparm(0) ))

/**
* Declare a function with libgcc implicit linkage
*
* 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 ))

#endif /* ASSEMBLY */

#endif /* _BITS_COMPILER_H */
2 changes: 1 addition & 1 deletion src/libgcc/__divdi3.c
Expand Up @@ -4,7 +4,7 @@

#include "libgcc.h"

LIBGCC int64_t __divdi3(int64_t num, int64_t den)
__libgcc int64_t __divdi3(int64_t num, int64_t den)
{
int minus = 0;
int64_t v;
Expand Down
2 changes: 1 addition & 1 deletion src/libgcc/__moddi3.c
Expand Up @@ -4,7 +4,7 @@

#include "libgcc.h"

LIBGCC int64_t __moddi3(int64_t num, int64_t den)
__libgcc int64_t __moddi3(int64_t num, int64_t den)
{
int minus = 0;
int64_t v;
Expand Down
2 changes: 1 addition & 1 deletion src/libgcc/__udivdi3.c
Expand Up @@ -4,7 +4,7 @@

#include "libgcc.h"

LIBGCC uint64_t __udivdi3(uint64_t num, uint64_t den)
__libgcc uint64_t __udivdi3(uint64_t num, uint64_t den)
{
return __udivmoddi4(num, den, NULL);
}
2 changes: 1 addition & 1 deletion src/libgcc/__udivmoddi4.c
@@ -1,6 +1,6 @@
#include "libgcc.h"

LIBGCC uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem_p)
__libgcc uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem_p)
{
uint64_t quot = 0, qbit = 1;

Expand Down
2 changes: 1 addition & 1 deletion src/libgcc/__umoddi3.c
Expand Up @@ -4,7 +4,7 @@

#include "libgcc.h"

LIBGCC uint64_t __umoddi3(uint64_t num, uint64_t den)
__libgcc uint64_t __umoddi3(uint64_t num, uint64_t den)
{
uint64_t v;

Expand Down
24 changes: 6 additions & 18 deletions src/libgcc/libgcc.h
Expand Up @@ -4,23 +4,11 @@
#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);
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 */

0 comments on commit 849e4b1

Please sign in to comment.