Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | /* * Copyright (c) 2010-2014 Wind River Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file * @brief Common toolchain abstraction * * Macros to abstract compiler capabilities (common to all toolchains). */ /* Abstract use of extern keyword for compatibility between C and C++ */ #ifdef __cplusplus #define EXTERN_C extern "C" #else #define EXTERN_C extern #endif /* Use TASK_ENTRY_CPP to tag task entry points defined in C++ files. */ #ifdef __cplusplus #define TASK_ENTRY_CPP extern "C" #endif /* * Generate a reference to an external symbol. * The reference indicates to the linker that the symbol is required * by the module containing the reference and should be included * in the image if the module is in the image. * * The assembler directive ".set" is used to define a local symbol. * No memory is allocated, and the local symbol does not appear in * the symbol table. */ #ifdef _ASMLANGUAGE #define REQUIRES(sym) .set sym ## _Requires, sym #else #define REQUIRES(sym) __asm__ (".set " # sym "_Requires, " # sym "\n\t"); #endif #ifdef _ASMLANGUAGE #define SECTION .section #endif /* * The following definitions are used for symbol name compatibility. * * When #if 1, sources are assembled assuming the compiler * you are using does not generate global symbols prefixed by "_". * (e.g. elf/dwarf) * * When #if 0, sources are assembled assuming the compiler * you are using generates global symbols prefixed by "_". * (e.g. coff/stabs) */ #ifdef _ASMLANGUAGE #ifndef TOOL_PREPENDS_UNDERSCORE #define FUNC(sym) sym #else #define FUNC(sym) _##sym #endif #endif /* * If the project is being built for speed (i.e. not for minimum size) then * align functions and branches in executable sections to improve performance. */ #ifdef _ASMLANGUAGE #ifdef CONFIG_X86 #ifdef PERF_OPT #define PERFOPT_ALIGN .balign 16 #else #define PERFOPT_ALIGN .balign 1 #endif #elif defined(CONFIG_ARM) #ifdef CONFIG_ISA_THUMB #define PERFOPT_ALIGN .balign 2 #else #define PERFOPT_ALIGN .balign 4 #endif #elif defined(CONFIG_ARC) #define PERFOPT_ALIGN .balign 4 #elif defined(CONFIG_NIOS2) #define PERFOPT_ALIGN .balign 4 #else #error Architecture unsupported #endif #define GC_SECTION(sym) SECTION .text.FUNC(sym), "ax" #define BRANCH_LABEL(sym) FUNC(sym) : #define VAR(sym) FUNC(sym) #endif /* _ASMLANGUAGE */ /* force inlining a function */ #if !defined(_ASMLANGUAGE) #define ALWAYS_INLINE inline __attribute__((always_inline)) #endif #define _STRINGIFY(x) #x #define STRINGIFY(s) _STRINGIFY(s) /* Indicate that an array will be used for stack space. */ #define __stack __aligned(STACK_ALIGN) /* concatenate the values of the arguments into one */ #define _DO_CONCAT(x, y) x ## y #define _CONCAT(x, y) _DO_CONCAT(x, y) |