AFLOW
 
Loading...
Searching...
No Matches
aurostd_incbin_defs.h
Go to the documentation of this file.
1// ***************************************************************************
2// * *
3// * Aflow STEFANO CURTAROLO - Duke University 2003-2024 *
4// * *
5// ***************************************************************************
6// This file contains the "Utility for including binary files" from Dale Weiler
7// with alterations for the AFLOW software package.
8//
9// Originally published under "The Unlicense" at https://github.com/graphitemaster/incbin/
10// "This is free and unencumbered software released into the public domain.
11//
12// Anyone is free to copy, modify, publish, use, compile, sell, or
13// distribute this software, either in source code form or as a compiled
14// binary, for any purpose, commercial or non-commercial, and by any
15// means.
16//
17// In jurisdictions that recognize copyright laws, the author or authors
18// of this software dedicate any and all copyright interest in the
19// software to the public domain. We make this dedication for the benefit
20// of the public at large and to the detriment of our heirs and
21// successors. We intend this dedication to be an overt act of
22// relinquishment in perpetuity of all present and future rights to this
23// software under copyright law.
24//
25// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
28// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
29// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
30// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
31// OTHER DEALINGS IN THE SOFTWARE.
32//
33// For more information, please refer to <http://unlicense.org/>"
34
35#ifndef _AUROSTD_INCBIN_H_
36#define _AUROSTD_INCBIN_H_
37
38#ifndef INCBIN_HDR
39#define INCBIN_HDR
40
41#define INCBIN_PREFIX afdata
42#define INCBIN_SILENCE_BITCODE_WARNING
43
44#if defined(__AVX512BW__) || defined(__AVX512CD__) || defined(__AVX512DQ__) || defined(__AVX512ER__) || defined(__AVX512PF__) || defined(__AVX512VL__) || defined(__AVX512F__)
45#define INCBIN_ALIGNMENT_INDEX 6
46#elif defined(__AVX__) || defined(__AVX2__)
47#define INCBIN_ALIGNMENT_INDEX 5
48#elif defined(__SSE__) || defined(__SSE2__) || defined(__SSE3__) || defined(__SSSE3__) || defined(__SSE4_1__) || defined(__SSE4_2__) || defined(__neon__) || defined(__ARM_NEON) || defined(__ALTIVEC__)
49#define INCBIN_ALIGNMENT_INDEX 4
50#elif ULONG_MAX != 0xffffffffu
51#define INCBIN_ALIGNMENT_INDEX 3
52#else
53#define INCBIN_ALIGNMENT_INDEX 2
54#endif
55
56/* Lookup table of (1 << n) where `n' is `INCBIN_ALIGNMENT_INDEX' */
57#define INCBIN_ALIGN_SHIFT_0 1
58#define INCBIN_ALIGN_SHIFT_1 2
59#define INCBIN_ALIGN_SHIFT_2 4
60#define INCBIN_ALIGN_SHIFT_3 8
61#define INCBIN_ALIGN_SHIFT_4 16
62#define INCBIN_ALIGN_SHIFT_5 32
63#define INCBIN_ALIGN_SHIFT_6 64
64
65/* Actual alignment value */
66#define INCBIN_ALIGNMENT INCBIN_CONCATENATE(INCBIN_CONCATENATE(INCBIN_ALIGN_SHIFT, _), INCBIN_ALIGNMENT_INDEX)
67
68/* Stringize */
69#define INCBIN_STR(X) #X
70#define INCBIN_STRINGIZE(X) INCBIN_STR(X)
71/* Concatenate */
72#define INCBIN_CAT(X, Y) X##Y
73#define INCBIN_CONCATENATE(X, Y) INCBIN_CAT(X, Y)
74/* Deferred macro expansion */
75#define INCBIN_EVAL(X) X
76#define INCBIN_INVOKE(N, ...) INCBIN_EVAL(N(__VA_ARGS__))
77/* Variable argument count for overloading by arity */
78#define INCBIN_VA_ARG_COUNTER(_1, _2, _3, N, ...) N
79#define INCBIN_VA_ARGC(...) INCBIN_VA_ARG_COUNTER(__VA_ARGS__, 3, 2, 1, 0)
80
81/* Green Hills uses a different directive for including binary data */
82#if defined(__ghs__)
83#if (__ghs_asm == 2)
84#define INCBIN_MACRO ".file"
85/* Or consider the ".myrawdata" entry in the ld file */
86#else
87#define INCBIN_MACRO "\tINCBIN"
88#endif
89#else
90#define INCBIN_MACRO ".incbin"
91#endif
92
93#ifndef _MSC_VER
94#define INCBIN_ALIGN __attribute__((aligned(INCBIN_ALIGNMENT)))
95#else
96#define INCBIN_ALIGN __declspec(align(INCBIN_ALIGNMENT))
97#endif
98
99#if defined(__arm__) || /* GNU C and RealView */ \
100 defined(__arm) || /* Diab */ \
101 defined(_ARM) /* ImageCraft */
102#define INCBIN_ARM
103#endif
104
105#ifdef __GNUC__
106/* Utilize .balign where supported */
107#define INCBIN_ALIGN_HOST ".balign " INCBIN_STRINGIZE(INCBIN_ALIGNMENT) "\n"
108#define INCBIN_ALIGN_BYTE ".balign 1\n"
109#elif defined(INCBIN_ARM)
110/*
111 * On arm assemblers, the alignment value is calculated as (1 << n) where `n' is
112 * the shift count. This is the value passed to `.align'
113 */
114#define INCBIN_ALIGN_HOST ".align " INCBIN_STRINGIZE(INCBIN_ALIGNMENT_INDEX) "\n"
115#define INCBIN_ALIGN_BYTE ".align 0\n"
116#else
117/* We assume other inline assembler's treat `.align' as `.balign' */
118#define INCBIN_ALIGN_HOST ".align " INCBIN_STRINGIZE(INCBIN_ALIGNMENT) "\n"
119#define INCBIN_ALIGN_BYTE ".align 1\n"
120#endif
121
122/* INCBIN_CONST is used by incbin.c generated files */
123#if defined(__cplusplus)
124#define INCBIN_EXTERNAL extern "C"
125#define INCBIN_CONST extern const
126#else
127#define INCBIN_EXTERNAL extern
128#define INCBIN_CONST const
129#endif
130
138#if !defined(INCBIN_OUTPUT_SECTION)
139#if defined(__APPLE__)
140#define INCBIN_OUTPUT_SECTION ".const_data"
141#else
142#define INCBIN_OUTPUT_SECTION ".rodata"
143#endif
144#endif
145
152#if !defined(INCBIN_OUTPUT_DATA_SECTION)
153#define INCBIN_OUTPUT_DATA_SECTION INCBIN_OUTPUT_SECTION
154#endif
155
166#if !defined(INCBIN_OUTPUT_SIZE_SECTION)
167#define INCBIN_OUTPUT_SIZE_SECTION INCBIN_OUTPUT_SECTION
168#endif
169
170#if defined(__APPLE__)
171#include "TargetConditionals.h"
172#if defined(TARGET_OS_IPHONE) && !defined(INCBIN_SILENCE_BITCODE_WARNING)
173#warning \
174 "incbin is incompatible with bitcode. Using the library will break upload to App Store if you have bitcode enabled. Add `#define INCBIN_SILENCE_BITCODE_WARNING` before including this header to silence this warning."
175#endif
176/* The directives are different for Apple branded compilers */
177#define INCBIN_SECTION INCBIN_OUTPUT_SECTION "\n"
178#define INCBIN_GLOBAL(NAME) ".globl " INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME "\n"
179#define INCBIN_INT ".long "
180#define INCBIN_MANGLE "_"
181#define INCBIN_BYTE ".byte "
182#define INCBIN_TYPE(...)
183#else
184#define INCBIN_SECTION ".section " INCBIN_OUTPUT_SECTION "\n"
185#define INCBIN_GLOBAL(NAME) ".global " INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME "\n"
186#if defined(__ghs__)
187#define INCBIN_INT ".word "
188#else
189#define INCBIN_INT ".int "
190#endif
191#if defined(__USER_LABEL_PREFIX__)
192#define INCBIN_MANGLE INCBIN_STRINGIZE(__USER_LABEL_PREFIX__)
193#else
194#define INCBIN_MANGLE ""
195#endif
196#if defined(INCBIN_ARM)
197/* On arm assemblers, `@' is used as a line comment token */
198#define INCBIN_TYPE(NAME) ".type " INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME ", %object\n"
199#elif defined(__MINGW32__) || defined(__MINGW64__)
200/* Mingw doesn't support this directive either */
201#define INCBIN_TYPE(NAME)
202#else
203/* It's safe to use `@' on other architectures */
204#define INCBIN_TYPE(NAME) ".type " INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME ", @object\n"
205#endif
206#define INCBIN_BYTE ".byte "
207#endif
208
209/* List of style types used for symbol names */
210#define INCBIN_STYLE_CAMEL 0
211#define INCBIN_STYLE_SNAKE 1
212
229#if !defined(INCBIN_PREFIX)
230#define INCBIN_PREFIX g
231#endif
232
253#if !defined(INCBIN_STYLE)
254#define INCBIN_STYLE INCBIN_STYLE_CAMEL
255#endif
256
257/* Style lookup tables */
258#define INCBIN_STYLE_0_DATA Data
259#define INCBIN_STYLE_0_END End
260#define INCBIN_STYLE_0_SIZE Size
261#define INCBIN_STYLE_1_DATA _data
262#define INCBIN_STYLE_1_END _end
263#define INCBIN_STYLE_1_SIZE _size
264
265/* Style lookup: returning identifier */
266#define INCBIN_STYLE_IDENT(TYPE) INCBIN_CONCATENATE(INCBIN_STYLE_, INCBIN_CONCATENATE(INCBIN_EVAL(INCBIN_STYLE), INCBIN_CONCATENATE(_, TYPE)))
267
268/* Style lookup: returning string literal */
269#define INCBIN_STYLE_STRING(TYPE) INCBIN_STRINGIZE(INCBIN_STYLE_IDENT(TYPE))
270
271/* Generate the global labels by indirectly invoking the macro with our style
272 * type and concatenating the name against them. */
273#define INCBIN_GLOBAL_LABELS(NAME, TYPE) \
274 INCBIN_INVOKE(INCBIN_GLOBAL, INCBIN_CONCATENATE(NAME, INCBIN_INVOKE(INCBIN_STYLE_IDENT, TYPE))) \
275 INCBIN_INVOKE(INCBIN_TYPE, INCBIN_CONCATENATE(NAME, INCBIN_INVOKE(INCBIN_STYLE_IDENT, TYPE)))
276
308#define INCBIN_EXTERN(...) INCBIN_CONCATENATE(INCBIN_EXTERN_, INCBIN_VA_ARGC(__VA_ARGS__))(__VA_ARGS__)
309#define INCBIN_EXTERN_1(NAME, ...) INCBIN_EXTERN_2(unsigned char, NAME)
310#define INCBIN_EXTERN_2(TYPE, NAME) \
311 INCBIN_EXTERNAL const INCBIN_ALIGN TYPE INCBIN_CONCATENATE(INCBIN_CONCATENATE(INCBIN_PREFIX, NAME), INCBIN_STYLE_IDENT(DATA))[]; \
312 INCBIN_EXTERNAL const INCBIN_ALIGN TYPE *const INCBIN_CONCATENATE(INCBIN_CONCATENATE(INCBIN_PREFIX, NAME), INCBIN_STYLE_IDENT(END)); \
313 INCBIN_EXTERNAL const unsigned int INCBIN_CONCATENATE(INCBIN_CONCATENATE(INCBIN_PREFIX, NAME), INCBIN_STYLE_IDENT(SIZE))
314
335#define INCTXT_EXTERN(NAME) INCBIN_EXTERN_2(char, NAME)
336
376#ifdef _MSC_VER
377#define INCBIN(NAME, FILENAME) INCBIN_EXTERN(NAME)
378#else
379#define INCBIN(...) INCBIN_CONCATENATE(INCBIN_, INCBIN_VA_ARGC(__VA_ARGS__))(__VA_ARGS__)
380#if defined(__GNUC__)
381#define INCBIN_1(...) _Pragma("GCC error \"Single argument INCBIN not allowed\"")
382#elif defined(__clang__)
383#define INCBIN_1(...) _Pragma("clang error \"Single argument INCBIN not allowed\"")
384#else
385#define INCBIN_1(...) /* Cannot do anything here */
386#endif
387#define INCBIN_2(NAME, FILENAME) INCBIN_3(unsigned char, NAME, FILENAME)
388#define INCBIN_3(TYPE, NAME, FILENAME) INCBIN_COMMON(TYPE, NAME, FILENAME, /* No terminator for binary data */)
389#define INCBIN_COMMON(TYPE, NAME, FILENAME, TERMINATOR) \
390 __asm__(INCBIN_SECTION INCBIN_GLOBAL_LABELS(NAME, DATA) \
391 INCBIN_ALIGN_HOST INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(DATA) ":\n" INCBIN_MACRO " \"" FILENAME "\"\n" TERMINATOR INCBIN_GLOBAL_LABELS(NAME, END) \
392 INCBIN_ALIGN_BYTE INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(END) ":\n" INCBIN_BYTE "1\n" INCBIN_GLOBAL_LABELS(NAME, SIZE) \
393 INCBIN_ALIGN_HOST INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(SIZE) ":\n" INCBIN_INT INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING( \
394 END) " - " INCBIN_MANGLE INCBIN_STRINGIZE(INCBIN_PREFIX) #NAME INCBIN_STYLE_STRING(DATA) "\n" INCBIN_ALIGN_HOST ".text\n"); \
395 INCBIN_EXTERN(TYPE, NAME)
396#endif
397
429#if defined(_MSC_VER)
430#define INCTXT(NAME, FILENAME) INCBIN_EXTERN(NAME)
431#else
432#define INCTXT(NAME, FILENAME) INCBIN_COMMON(char, NAME, FILENAME, INCBIN_BYTE "0\n")
433#endif
434
435#endif
436
437#endif // _AUROSTD_INCBIN_H_