1 /* 2 * This file is part of the coreboot project. 3 * 4 * Copyright (C) 2009 coresystems GmbH 5 * 6 * SPDX-License-Identifier: GPL-2.0 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); \ 20 type __attribute__((no_instrument_function)) \ 21 __wrap_##name(type a, type b) \ 22 { return __normal_##name(a, b); } 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 30