BUILD 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. # Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. # Exceptions. See /LICENSE for license information.
  3. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
  5. load("@rules_shell//shell:sh_test.bzl", "sh_test")
  6. load("//bazel/cc_rules:defs.bzl", "cc_binary", "cc_library", "cc_test")
  7. load("//bazel/cc_toolchains:defs.bzl", "cc_env")
  8. load("//testing/fuzzing:rules.bzl", "cc_fuzz_test")
  9. load(":prebuilt_runtimes.bzl", "prebuilt_runtimes")
  10. package(default_visibility = ["//visibility:public"])
  11. filegroup(
  12. name = "testdata",
  13. srcs = glob([
  14. "testdata/**/*.carbon",
  15. "testdata/**/*.cpp",
  16. ]),
  17. )
  18. cc_library(
  19. name = "clang_runner",
  20. srcs = [
  21. "clang_runner.cpp",
  22. "clang_runtimes.cpp",
  23. ],
  24. hdrs = [
  25. "clang_runner.h",
  26. "clang_runtimes.h",
  27. ],
  28. deps = [
  29. ":llvm_runner",
  30. ":runtimes_cache",
  31. ":tool_runner_base",
  32. "//common:check",
  33. "//common:error",
  34. "//common:filesystem",
  35. "//common:latch",
  36. "//common:ostream",
  37. "//common:string_helpers",
  38. "//common:vlog",
  39. "//third_party/llvm:clang_cc1",
  40. "//toolchain/base:clang_invocation",
  41. "//toolchain/base:install_paths",
  42. "//toolchain/base:kind_switch",
  43. "//toolchain/base:runtime_sources",
  44. "@llvm-project//clang:basic",
  45. "@llvm-project//clang:clang-driver",
  46. "@llvm-project//clang:codegen",
  47. "@llvm-project//clang:driver",
  48. "@llvm-project//clang:frontend",
  49. "@llvm-project//clang:frontend_tool",
  50. "@llvm-project//clang:serialization",
  51. "@llvm-project//llvm:Core",
  52. "@llvm-project//llvm:Object",
  53. "@llvm-project//llvm:Support",
  54. "@llvm-project//llvm:TargetParser",
  55. ],
  56. )
  57. cc_test(
  58. name = "clang_runner_test",
  59. size = "small",
  60. srcs = ["clang_runner_test.cpp"],
  61. data = ["//toolchain/install:install_data"],
  62. deps = [
  63. ":clang_runner",
  64. ":llvm_runner",
  65. ":runtimes_cache",
  66. "//common:all_llvm_targets",
  67. "//common:check",
  68. "//common:error_test_helpers",
  69. "//common:ostream",
  70. "//common:raw_string_ostream",
  71. "//testing/base:capture_std_streams",
  72. "//testing/base:file_helpers",
  73. "//testing/base:global_exe_path",
  74. "//testing/base:gtest_main",
  75. "//toolchain/base:install_paths",
  76. "@googletest//:gtest",
  77. "@llvm-project//llvm:Object",
  78. "@llvm-project//llvm:Support",
  79. "@llvm-project//llvm:TargetParser",
  80. ],
  81. )
  82. cc_test(
  83. name = "clang_runtimes_test",
  84. size = "medium",
  85. srcs = ["clang_runtimes_test.cpp"],
  86. data = [
  87. ":prebuilt_runtimes",
  88. "//toolchain/install:install_data",
  89. ],
  90. deps = [
  91. ":clang_runner",
  92. ":llvm_runner",
  93. ":runtimes_cache",
  94. "//common:all_llvm_targets",
  95. "//common:check",
  96. "//common:ostream",
  97. "//common:raw_string_ostream",
  98. "//testing/base:capture_std_streams",
  99. "//testing/base:file_helpers",
  100. "//testing/base:global_exe_path",
  101. "//testing/base:gtest_main",
  102. "//toolchain/base:install_paths",
  103. "//toolchain/base:llvm_tools",
  104. "@bazel_tools//tools/cpp/runfiles",
  105. "@googletest//:gtest",
  106. "@llvm-project//llvm:Object",
  107. "@llvm-project//llvm:Support",
  108. "@llvm-project//llvm:TargetParser",
  109. ],
  110. )
  111. cc_binary(
  112. name = "compile_benchmark",
  113. testonly = 1,
  114. srcs = ["compile_benchmark.cpp"],
  115. deps = [
  116. ":driver",
  117. "//common:all_llvm_targets",
  118. "//testing/base:benchmark_main",
  119. "//testing/base:global_exe_path",
  120. "//testing/base:source_gen_lib",
  121. "//toolchain/base:install_paths_test_helpers",
  122. "//toolchain/testing:compile_helper",
  123. "@google_benchmark//:benchmark",
  124. "@llvm-project//llvm:Support",
  125. ],
  126. )
  127. sh_test(
  128. name = "compile_benchmark_test",
  129. size = "small",
  130. srcs = [":compile_benchmark"],
  131. args = [
  132. "--benchmark_dry_run",
  133. # The `$$` is repeated for Bazel escaping of `$`.
  134. "--benchmark_filter=/256$$",
  135. ],
  136. env = cc_env(),
  137. )
  138. cc_library(
  139. name = "codegen_options",
  140. srcs = [
  141. "codegen_options.cpp",
  142. ],
  143. hdrs = [
  144. "codegen_options.h",
  145. ],
  146. deps = [
  147. "//common:command_line",
  148. "@llvm-project//llvm:Support",
  149. "@llvm-project//llvm:TargetParser",
  150. ],
  151. )
  152. cc_library(
  153. name = "driver",
  154. srcs = [
  155. "build_runtimes_subcommand.cpp",
  156. "build_runtimes_subcommand.h",
  157. "clang_subcommand.cpp",
  158. "clang_subcommand.h",
  159. "compile_subcommand.cpp",
  160. "compile_subcommand.h",
  161. "config_subcommand.cpp",
  162. "config_subcommand.h",
  163. "driver.cpp",
  164. "driver_env.h",
  165. "driver_subcommand.cpp",
  166. "format_subcommand.cpp",
  167. "format_subcommand.h",
  168. "language_server_subcommand.cpp",
  169. "language_server_subcommand.h",
  170. "link_subcommand.cpp",
  171. "link_subcommand.h",
  172. "lld_subcommand.cpp",
  173. "lld_subcommand.h",
  174. "llvm_subcommand.cpp",
  175. "llvm_subcommand.h",
  176. ],
  177. hdrs = [
  178. "driver.h",
  179. "driver_subcommand.h",
  180. ],
  181. data = [
  182. "//toolchain/install:install_data.no_driver",
  183. ],
  184. textual_hdrs = ["flags.def"],
  185. deps = [
  186. ":clang_runner",
  187. ":codegen_options",
  188. ":lld_runner",
  189. ":llvm_runner",
  190. ":runtimes_cache",
  191. "//common:check",
  192. "//common:command_line",
  193. "//common:error",
  194. "//common:filesystem",
  195. "//common:ostream",
  196. "//common:pretty_stack_trace_function",
  197. "//common:raw_string_ostream",
  198. "//common:version",
  199. "//common:vlog",
  200. "//toolchain/base:clang_invocation",
  201. "//toolchain/base:install_paths",
  202. "//toolchain/base:llvm_tools",
  203. "//toolchain/base:shared_value_stores",
  204. "//toolchain/base:timings",
  205. "//toolchain/check",
  206. "//toolchain/codegen",
  207. "//toolchain/diagnostics:emitter",
  208. "//toolchain/diagnostics:sorting_consumer",
  209. "//toolchain/format",
  210. "//toolchain/language_server",
  211. "//toolchain/lex",
  212. "//toolchain/lower",
  213. "//toolchain/lower:options",
  214. "//toolchain/parse",
  215. "//toolchain/parse:tree",
  216. "//toolchain/sem_ir:file",
  217. "//toolchain/sem_ir:typed_insts",
  218. "//toolchain/source:source_buffer",
  219. "@llvm-project//clang:codegen",
  220. "@llvm-project//clang:frontend",
  221. "@llvm-project//clang:lex",
  222. "@llvm-project//llvm:Core",
  223. "@llvm-project//llvm:MC",
  224. "@llvm-project//llvm:Passes",
  225. "@llvm-project//llvm:Support",
  226. "@llvm-project//llvm:TargetParser",
  227. ],
  228. )
  229. cc_test(
  230. name = "driver_test",
  231. size = "small",
  232. srcs = ["driver_test.cpp"],
  233. deps = [
  234. ":driver",
  235. "//common:all_llvm_targets",
  236. "//common:error_test_helpers",
  237. "//common:filesystem",
  238. "//common:raw_string_ostream",
  239. "//testing/base:file_helpers",
  240. "//testing/base:global_exe_path",
  241. "//testing/base:gtest_main",
  242. "//toolchain/base:install_paths",
  243. "//toolchain/diagnostics:emitter",
  244. "//toolchain/lex:tokenized_buffer_test_helpers",
  245. "//toolchain/testing:yaml_test_helpers",
  246. "@googletest//:gtest",
  247. "@llvm-project//llvm:Object",
  248. "@llvm-project//llvm:Support",
  249. ],
  250. )
  251. cc_fuzz_test(
  252. name = "driver_fuzzer",
  253. size = "small",
  254. srcs = ["driver_fuzzer.cpp"],
  255. corpus = glob(["fuzzer_corpus/*"]),
  256. deps = [
  257. ":driver",
  258. "//common:exe_path",
  259. "//common:raw_string_ostream",
  260. "//testing/fuzzing:libfuzzer_header",
  261. "//toolchain/base:install_paths",
  262. "@llvm-project//llvm:Support",
  263. ],
  264. )
  265. cc_library(
  266. name = "lld_runner",
  267. srcs = ["lld_runner.cpp"],
  268. hdrs = ["lld_runner.h"],
  269. deps = [
  270. ":tool_runner_base",
  271. "//common:ostream",
  272. "//common:string_helpers",
  273. "//common:vlog",
  274. "//toolchain/base:install_paths",
  275. "@llvm-project//lld:Common",
  276. "@llvm-project//lld:ELF",
  277. "@llvm-project//lld:MachO",
  278. "@llvm-project//llvm:Support",
  279. ],
  280. )
  281. cc_test(
  282. name = "lld_runner_test",
  283. size = "small",
  284. srcs = ["lld_runner_test.cpp"],
  285. deps = [
  286. ":clang_runner",
  287. ":lld_runner",
  288. "//common:all_llvm_targets",
  289. "//common:check",
  290. "//common:ostream",
  291. "//common:raw_string_ostream",
  292. "//testing/base:capture_std_streams",
  293. "//testing/base:file_helpers",
  294. "//testing/base:global_exe_path",
  295. "//testing/base:gtest_main",
  296. "@googletest//:gtest",
  297. "@llvm-project//llvm:Object",
  298. "@llvm-project//llvm:Support",
  299. "@llvm-project//llvm:TargetParser",
  300. ],
  301. )
  302. cc_library(
  303. name = "llvm_runner",
  304. srcs = ["llvm_runner.cpp"],
  305. hdrs = ["llvm_runner.h"],
  306. deps = [
  307. ":tool_runner_base",
  308. "//common:ostream",
  309. "//common:string_helpers",
  310. "//common:vlog",
  311. "//toolchain/base:install_paths",
  312. "//toolchain/base:llvm_tools",
  313. "@llvm-project//lld:Common",
  314. "@llvm-project//lld:ELF",
  315. "@llvm-project//lld:MachO",
  316. "@llvm-project//llvm:Support",
  317. ],
  318. )
  319. cc_test(
  320. name = "llvm_runner_test",
  321. size = "small",
  322. srcs = ["llvm_runner_test.cpp"],
  323. deps = [
  324. ":llvm_runner",
  325. "//common:all_llvm_targets",
  326. "//common:ostream",
  327. "//common:raw_string_ostream",
  328. "//testing/base:capture_std_streams",
  329. "//testing/base:global_exe_path",
  330. "//testing/base:gtest_main",
  331. "@googletest//:gtest",
  332. "@llvm-project//llvm:Support",
  333. ],
  334. )
  335. cc_library(
  336. name = "runtimes_cache",
  337. srcs = ["runtimes_cache.cpp"],
  338. hdrs = ["runtimes_cache.h"],
  339. deps = [
  340. "//common:check",
  341. "//common:error",
  342. "//common:filesystem",
  343. "//common:ostream",
  344. "//common:version",
  345. "//common:vlog",
  346. "//toolchain/base:install_paths",
  347. "@llvm-project//llvm:Support",
  348. ],
  349. )
  350. cc_test(
  351. name = "runtimes_cache_test",
  352. size = "small",
  353. srcs = ["runtimes_cache_test.cpp"],
  354. data = ["//toolchain/install:install_data"],
  355. deps = [
  356. ":runtimes_cache",
  357. "//common:check",
  358. "//common:error_test_helpers",
  359. "//common:filesystem",
  360. "//common:ostream",
  361. "//common:raw_string_ostream",
  362. "//common:version",
  363. "//testing/base:capture_std_streams",
  364. "//testing/base:file_helpers",
  365. "//testing/base:global_exe_path",
  366. "//testing/base:gtest_main",
  367. "@googletest//:gtest",
  368. "@llvm-project//llvm:Support",
  369. ],
  370. )
  371. cc_library(
  372. name = "tool_runner_base",
  373. srcs = ["tool_runner_base.cpp"],
  374. hdrs = ["tool_runner_base.h"],
  375. data = [
  376. "//toolchain/install:install_data.no_driver",
  377. ],
  378. deps = [
  379. "//common:ostream",
  380. "//common:vlog",
  381. "//toolchain/base:install_paths",
  382. "@llvm-project//llvm:Support",
  383. ],
  384. )
  385. cc_binary(
  386. name = "bazel_build_clang_runtimes",
  387. srcs = ["bazel_build_clang_runtimes.cpp"],
  388. data = [
  389. "//toolchain/install:install_data.no_driver",
  390. "@llvm-project//clang:clang",
  391. ],
  392. deps = [
  393. ":clang_runner",
  394. ":codegen_options",
  395. ":runtimes_cache",
  396. "//common:all_llvm_targets",
  397. "//common:bazel_working_dir",
  398. "//common:check",
  399. "//common:command_line",
  400. "//common:error",
  401. "//common:exe_path",
  402. "//common:filesystem",
  403. "//common:init_llvm",
  404. "//common:raw_string_ostream",
  405. "//common:version",
  406. "//toolchain/base:install_paths",
  407. "@bazel_tools//tools/cpp/runfiles",
  408. "@llvm-project//llvm:Support",
  409. "@llvm-project//llvm:TargetParser",
  410. ],
  411. )
  412. # Flag controlling whether the target config is used for the
  413. # tools used by the `prebuilt_runtimes` rules.
  414. #
  415. # Using the exec config is more correct and will also optimize the tools used to
  416. # build the runtimes, potentially making them run faster. However, it will
  417. # likely double the number of compiles needed to build everything necessary in
  418. # that configuration. As a consequence, it is useful in development and CI when
  419. # the target config is compatible with the exec config to set this flag.
  420. bool_flag(
  421. name = "use_target_config_runtimes_builder",
  422. build_setting_default = False,
  423. )
  424. config_setting(
  425. name = "use_target_config_runtimes_builder_config",
  426. flag_values = {":use_target_config_runtimes_builder": "True"},
  427. )
  428. # TODO: Correctly set the `target` argument here based on the Bazel target
  429. # platform. Without this, we will generate invalid prebuilt runtimes when cross
  430. # compiling.
  431. prebuilt_runtimes(
  432. name = "prebuilt_runtimes",
  433. )