]>
Commit | Line | Data |
---|---|---|
36b2409a GB |
1 | /* |
2 | * This file is part of the coreboot project. | |
3 | * | |
4 | * Copyright (C) 2009 coresystems GmbH | |
5 | * | |
5b8031cc | 6 | * SPDX-License-Identifier: GPL-2.0 |
36b2409a GB |
7 | */ |
8 | ||
9 | #ifdef __GNUC__ | |
10 | ||
11 | /* | |
12 | * GCC's libgcc handling is quite broken. While the libgcc functions | |
13 | * are always regparm(0) the code that calls them uses whatever the | |
14 | * compiler call specifies. Therefore we need a wrapper around those | |
15 | * functions. See gcc bug PR41055 for more information. | |
16 | */ | |
17 | #define WRAP_LIBGCC_CALL(type, name) \ | |
18 | type __normal_##name(type a, type b) __attribute__((regparm(0))); \ | |
19 | type __wrap_##name(type a, type b); \ | |
d8819f94 SG |
20 | type __attribute__((no_instrument_function)) \ |
21 | __wrap_##name(type a, type b) \ | |
22 | { return __normal_##name(a, b); } | |
36b2409a GB |
23 | |
24 | WRAP_LIBGCC_CALL(long long, __divdi3) | |
25 | WRAP_LIBGCC_CALL(unsigned long long, __udivdi3) | |
26 | WRAP_LIBGCC_CALL(long long, __moddi3) | |
27 | WRAP_LIBGCC_CALL(unsigned long long, __umoddi3) | |
28 | ||
29 | #endif |