1import("//llvm/lib/DebugInfo/PDB/enable_dia.gni") 2import("//llvm/lib/Target/targets.gni") 3import("//llvm/lib/Target/targets_with_asm_parsers.gni") 4import("//llvm/lib/Target/targets_with_disassemblers.gni") 5import("//llvm/triples.gni") 6import("//llvm/utils/gn/build/buildflags.gni") 7import("//llvm/utils/gn/build/libs/edit/enable.gni") 8import("//llvm/utils/gn/build/libs/pthread/enable.gni") 9import("//llvm/utils/gn/build/libs/terminfo/enable.gni") 10import("//llvm/utils/gn/build/libs/xar/enable.gni") 11import("//llvm/utils/gn/build/libs/xml/enable.gni") 12import("//llvm/utils/gn/build/libs/zlib/enable.gni") 13import("//llvm/utils/gn/build/write_cmake_config.gni") 14import("//llvm/version.gni") 15 16# Contains actions to create config.h, llvm-config.h, abi-breaking.h, 17# and the various .def files used by llvm/lib/Target. 18# Other than in the cmake build, these are created at build time, not at 19# config time. That way, they can run in parallel, and this pattern means that 20# e.g. creating the clang config header (which happens in another gn file) 21# doesn't block building lld. 22 23# The headers are created by processing the foo.h.cmake files as input, 24# to keep the gn build close to the cmake build. 25 26# Other than in the cmake build, header generation doesn't do any feature 27# checking. See also "Philosophy" in llvm/utils/gn/README.rst. 28 29############################################################################## 30# config.h, llvm-config.h, abi-breaking.h 31 32# FIXME: Several of the config settings go in a global config header but 33# are only used in a single translation unit -- so toggling that value 34# causes a full rebuild when it really only has to rebuild a single file. 35# Instead monolithing config headers, investigate using something like 36# https://is.gd/buildflag_header_gni instead (needs to be done in both the 37# cmake build and here). 38 39# FIXME: This hardcodes a bunch of settings I never use; some of them should 40# become declare_args if anyone wants to set them. 41 42declare_args() { 43 # Enable additional checks that alter the LLVM C++ ABI. 44 llvm_enable_abi_breaking_checks = llvm_enable_assertions 45 46 # Iterate unordered llvm containers in reverse. 47 llvm_enable_reverse_iteration = false 48} 49 50write_cmake_config("abi-breaking") { 51 input = "abi-breaking.h.cmake" 52 output = "$target_gen_dir/abi-breaking.h" 53 values = [] 54 55 if (llvm_enable_abi_breaking_checks) { 56 values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=1" ] 57 } else { 58 values += [ "LLVM_ENABLE_ABI_BREAKING_CHECKS=" ] 59 } 60 61 if (llvm_enable_reverse_iteration) { 62 values += [ "LLVM_ENABLE_REVERSE_ITERATION=1" ] 63 } else { 64 values += [ "LLVM_ENABLE_REVERSE_ITERATION=" ] 65 } 66} 67 68write_cmake_config("config") { 69 public_deps = [ ":llvm-config" ] 70 71 input = "config.h.cmake" 72 output = "$target_gen_dir/config.h" 73 values = [ 74 "BUG_REPORT_URL=https://bugs.llvm.org/", 75 "ENABLE_BACKTRACES=1", 76 "ENABLE_CRASH_OVERRIDES=1", 77 "BACKTRACE_HEADER=execinfo.h", 78 "HAVE_CRASHREPORTERCLIENT_H=", 79 "HAVE_DECL_FE_ALL_EXCEPT=1", 80 "HAVE_DECL_FE_INEXACT=1", 81 "LLVM_ENABLE_CRASH_DUMPS=", 82 "HAVE_ERRNO_H=1", 83 "HAVE_FCNTL_H=1", 84 "HAVE_FENV_H=1", 85 "HAVE_FFI_CALL=", 86 "HAVE_FFI_FFI_H=", 87 "HAVE_FFI_H=", 88 "HAVE_LIBPFM=", 89 "HAVE_LIBPSAPI=", 90 "HAVE_MALLCTL=", 91 "HAVE_SIGNAL_H=1", 92 "HAVE_STD_IS_TRIVIALLY_COPYABLE=1", 93 "HAVE_STRERROR=1", 94 "HAVE_SYS_STAT_H=1", 95 "HAVE_SYS_TYPES_H=1", 96 "HAVE_VALGRIND_VALGRIND_H=", 97 "HAVE__ALLOCA=", 98 "HAVE___ALLOCA=", 99 "HAVE___ASHLDI3=", 100 "HAVE___ASHRDI3=", 101 "HAVE___CHKSTK=", 102 "HAVE___CHKSTK_MS=", 103 "HAVE___CMPDI2=", 104 "HAVE___DIVDI3=", 105 "HAVE___FIXDFDI=", 106 "HAVE___FIXSFDI=", 107 "HAVE___FLOATDIDF=", 108 "HAVE___LSHRDI3=", 109 "HAVE___MAIN=", 110 "HAVE___MODDI3=", 111 "HAVE___UDIVDI3=", 112 "HAVE___UMODDI3=", 113 "HAVE____CHKSTK=", 114 "HAVE____CHKSTK_MS=", 115 "HOST_LINK_VERSION=", 116 "LLVM_TARGET_TRIPLE_ENV=", 117 "LLVM_VERSION_INFO=", 118 "LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO=1", 119 "PACKAGE_BUGREPORT=https://bugs.llvm.org/", 120 "PACKAGE_NAME=LLVM", 121 "PACKAGE_STRING=LLVM ${llvm_version}git", 122 "PACKAGE_VERSION=${llvm_version}git", 123 "PACKAGE_VENDOR=", 124 "RETSIGTYPE=void", 125 "LLVM_GISEL_COV_ENABLED=", 126 "LLVM_GISEL_COV_PREFIX=", 127 "LLVM_WITH_Z3=", 128 129 # FIXME: Set to 1 on mac once the 10.14 SDK is in common use. 130 "LLVM_SUPPORT_XCODE_SIGNPOSTS=", 131 132 # This is both in llvm-config.h and config.h; llvm-config.h doesn't 133 # define it if it's not set while config.h defines it to empty in that case. 134 "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple", 135 ] 136 137 if (current_os == "linux" || current_os == "android") { 138 values += [ 139 "HAVE_FUTIMENS=1", 140 "HAVE_LINK_H=1", 141 "HAVE_LSEEK64=1", 142 "HAVE_MALLINFO=1", 143 "HAVE_POSIX_FALLOCATE=1", 144 "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=1", 145 ] 146 } else { 147 values += [ 148 "HAVE_FUTIMENS=", 149 "HAVE_LINK_H=", 150 "HAVE_LSEEK64=", 151 "HAVE_MALLINFO=", 152 "HAVE_POSIX_FALLOCATE=", 153 "HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC=", 154 ] 155 } 156 157 if (current_os == "mac") { 158 values += [ 159 "HAVE_CRASHREPORTER_INFO=1", 160 "HAVE_DECL_ARC4RANDOM=1", 161 "HAVE_DLADDR=1", 162 "HAVE_MACH_MACH_H=1", 163 "HAVE_MALLOC_MALLOC_H=1", 164 "HAVE_MALLOC_ZONE_STATISTICS=1", 165 "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=1", 166 ] 167 } else { 168 values += [ 169 "HAVE_CRASHREPORTER_INFO=", 170 "HAVE_DECL_ARC4RANDOM=", 171 "HAVE_DLADDR=", 172 "HAVE_MACH_MACH_H=", 173 "HAVE_MALLOC_MALLOC_H=", 174 "HAVE_MALLOC_ZONE_STATISTICS=", 175 "HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC=", 176 ] 177 } 178 179 if (current_os == "linux" || current_os == "mac") { 180 values += [ 181 "HAVE_BACKTRACE=1", 182 "HAVE_POSIX_SPAWN=1", 183 "HAVE_PTHREAD_GETNAME_NP=1", 184 ] 185 } else { 186 values += [ 187 "HAVE_BACKTRACE=", 188 "HAVE_POSIX_SPAWN=", 189 "HAVE_PTHREAD_GETNAME_NP=", 190 ] 191 } 192 193 if (current_os == "win") { 194 values += [ 195 "HAVE_DECL_STRERROR_S=1", 196 "HAVE_DLFCN_H=", 197 "HAVE_DLOPEN=", 198 "HAVE_FUTIMES=", 199 "HAVE_GETPAGESIZE=", 200 "HAVE_GETRLIMIT=", 201 "HAVE_GETRUSAGE=", 202 "HAVE_ISATTY=", 203 "HAVE_LIBPTHREAD=", 204 "HAVE_PTHREAD_SETNAME_NP=", 205 "HAVE_PREAD=", 206 "HAVE_PTHREAD_GETSPECIFIC=", 207 "HAVE_PTHREAD_H=", 208 "HAVE_PTHREAD_MUTEX_LOCK=", 209 "HAVE_PTHREAD_RWLOCK_INIT=", 210 "HAVE_SBRK=", 211 "HAVE_SETENV=", 212 "HAVE_SETRLIMIT=", 213 "HAVE_SIGALTSTACK=", 214 "HAVE_STRERROR_R=", 215 "HAVE_SYSCONF=", 216 "HAVE_SYS_IOCTL_H=", 217 "HAVE_SYS_MMAN_H=", 218 "HAVE_SYS_PARAM_H=", 219 "HAVE_SYS_RESOURCE_H=", 220 "HAVE_SYS_TIME_H=", 221 "HAVE_TERMIOS_H=", 222 "HAVE_UNISTD_H=", 223 "HAVE__CHSIZE_S=1", 224 "HAVE__UNWIND_BACKTRACE=", 225 "stricmp=_stricmp", 226 "strdup=_strdup", 227 ] 228 } else { 229 # POSIX-y system defaults. 230 values += [ 231 "HAVE_DECL_STRERROR_S=", 232 "HAVE_DLFCN_H=1", 233 "HAVE_DLOPEN=1", 234 "HAVE_FUTIMES=1", 235 "HAVE_GETPAGESIZE=1", 236 "HAVE_GETRLIMIT=1", 237 "HAVE_GETRUSAGE=1", 238 "HAVE_ISATTY=1", 239 "HAVE_LIBPTHREAD=1", 240 "HAVE_PTHREAD_SETNAME_NP=1", 241 "HAVE_PREAD=1", 242 "HAVE_PTHREAD_GETSPECIFIC=1", 243 "HAVE_PTHREAD_H=1", 244 "HAVE_PTHREAD_MUTEX_LOCK=1", 245 "HAVE_PTHREAD_RWLOCK_INIT=1", 246 "HAVE_SBRK=1", 247 "HAVE_SETENV=1", 248 "HAVE_SETRLIMIT=1", 249 "HAVE_SIGALTSTACK=1", 250 "HAVE_STRERROR_R=1", 251 "HAVE_SYSCONF=1", 252 "HAVE_SYS_IOCTL_H=1", 253 "HAVE_SYS_MMAN_H=1", 254 "HAVE_SYS_PARAM_H=1", 255 "HAVE_SYS_RESOURCE_H=1", 256 "HAVE_SYS_TIME_H=1", 257 "HAVE_TERMIOS_H=1", 258 "HAVE_UNISTD_H=1", 259 "HAVE__CHSIZE_S=", 260 "HAVE__UNWIND_BACKTRACE=1", 261 "stricmp=", 262 "strdup=", 263 ] 264 } 265 266 if (current_os == "mac") { 267 values += [ "LTDL_SHLIB_EXT=.dylib" ] 268 } else if (current_os == "win") { 269 values += [ "LTDL_SHLIB_EXT=.dll" ] 270 } else { 271 values += [ "LTDL_SHLIB_EXT=.so" ] 272 } 273 274 if (llvm_enable_libedit) { 275 values += [ "HAVE_LIBEDIT=1" ] 276 } else { 277 values += [ "HAVE_LIBEDIT=" ] 278 } 279 280 if (llvm_enable_libxar) { 281 values += [ "HAVE_LIBXAR=1" ] 282 } else { 283 values += [ "HAVE_LIBXAR=" ] 284 } 285 286 if (llvm_enable_terminfo) { 287 values += [ "HAVE_TERMINFO=1" ] 288 } else { 289 values += [ "HAVE_TERMINFO=" ] 290 } 291 292 if (llvm_enable_dia_sdk) { 293 values += [ "LLVM_ENABLE_DIA_SDK=1" ] 294 } else { 295 values += [ "LLVM_ENABLE_DIA_SDK=" ] 296 } 297 298 # FIXME: Once https://reviews.llvm.org/D79219 is in, remove the two 299 # redundant HAVE_ variables. 300 if (llvm_enable_zlib) { 301 values += [ 302 "HAVE_LIBZ=1", 303 "HAVE_ZLIB_H=1", 304 "LLVM_ENABLE_ZLIB=1", 305 ] 306 } else { 307 values += [ 308 "HAVE_LIBZ=", 309 "HAVE_ZLIB_H=", 310 "LLVM_ENABLE_ZLIB=", 311 ] 312 } 313 314 if (llvm_enable_libxml2) { 315 values += [ "LLVM_LIBXML2_ENABLED=1" ] 316 } else { 317 values += [ "LLVM_LIBXML2_ENABLED=" ] 318 } 319} 320 321write_cmake_config("llvm-config") { 322 input = "llvm-config.h.cmake" 323 output = "$target_gen_dir/llvm-config.h" 324 values = [ 325 "LLVM_ENABLE_DUMP=", 326 "LLVM_DEFAULT_TARGET_TRIPLE=$llvm_target_triple", 327 "LLVM_HAS_ATOMICS=1", 328 "LLVM_HAVE_TF_API=", 329 "LLVM_HOST_TRIPLE=$llvm_current_triple", 330 "LLVM_NATIVE_ARCH=$native_target", 331 "LLVM_NATIVE_ASMPARSER=1", 332 "LLVM_NATIVE_ASMPRINTER=1", 333 "LLVM_NATIVE_DISASSEMBLER=1", 334 "LLVM_NATIVE_TARGET=1", 335 "LLVM_NATIVE_TARGETINFO=1", 336 "LLVM_NATIVE_TARGETMC=1", 337 "LLVM_USE_INTEL_JITEVENTS=", 338 "LLVM_USE_OPROFILE=", 339 "LLVM_USE_PERF=", 340 "LLVM_VERSION_MAJOR=$llvm_version_major", 341 "LLVM_VERSION_MINOR=$llvm_version_minor", 342 "LLVM_VERSION_PATCH=$llvm_version_patch", 343 "PACKAGE_VERSION=${llvm_version}git", 344 "LLVM_FORCE_ENABLE_STATS=", 345 ] 346 347 if (current_os == "win") { 348 values += [ "LLVM_ON_UNIX=" ] 349 } else { 350 values += [ "LLVM_ON_UNIX=1" ] 351 } 352 353 if (llvm_enable_threads) { 354 values += [ "LLVM_ENABLE_THREADS=1" ] 355 } else { 356 values += [ "LLVM_ENABLE_THREADS=" ] 357 } 358} 359 360############################################################################## 361# .def files used by llvm/lib/Target 362 363template("write_target_def_file") { 364 assert(defined(invoker.key), "must set 'key' in $target_name") 365 assert(defined(invoker.value), "must set 'value' in $target_name") 366 367 write_cmake_config(target_name) { 368 visibility = [ ":write_target_def_files" ] 369 input = "$target_name.in" 370 output = "$target_gen_dir/$target_name" 371 372 if (defined(invoker.all_targets)) { 373 all_targets = invoker.all_targets 374 } else { 375 all_targets = llvm_targets_to_build 376 } 377 378 # Build something like 379 # `LLVM_ENUM_ASM_PARSERS=LLVM_ASM_PARSER(ARM)\nLLVM_ASM_PARSER(X86)\n`. Note 380 # that \n is a literal '\' followed by a literal 'n', not a newline 381 # character. (write_cmake_config.py replaces that with a real newline). 382 value = "" 383 foreach(target, all_targets) { 384 value = "$value${invoker.value}($target)\n" 385 } 386 if (all_targets == []) { 387 not_needed(invoker, [ "value" ]) 388 } 389 values = [ "${invoker.key}=$value" ] 390 } 391} 392 393write_target_def_file("AsmParsers.def") { 394 key = "LLVM_ENUM_ASM_PARSERS" 395 value = "LLVM_ASM_PARSER" 396 all_targets = targets_with_asm_parsers 397} 398 399write_target_def_file("AsmPrinters.def") { 400 key = "LLVM_ENUM_ASM_PRINTERS" 401 value = "LLVM_ASM_PRINTER" 402} 403 404write_target_def_file("Disassemblers.def") { 405 key = "LLVM_ENUM_DISASSEMBLERS" 406 value = "LLVM_DISASSEMBLER" 407 all_targets = targets_with_disassemblers 408} 409 410write_target_def_file("Targets.def") { 411 key = "LLVM_ENUM_TARGETS" 412 value = "LLVM_TARGET" 413} 414 415group("write_target_def_files") { 416 visibility = [ 417 "//llvm/lib/Support", 418 "//llvm/lib/Target", 419 ] 420 deps = [ 421 ":AsmParsers.def", 422 ":AsmPrinters.def", 423 ":Disassemblers.def", 424 ":Targets.def", 425 ] 426} 427