authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-31 01:27:22+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-31 01:27:22+01:00
logf1f804e532e603a3f58d559d32a1c8120691d891
treedd744ef6ca7fc930887d86021eb01298b5cfacb0
parent17a87d734167b500761ef0d61493342dea0ae01d
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

zig_llvm: Reduce our exposure to LLVM API breakage.

LLVM recently introduced new Triple::ArchType members in 19.1.3 which broke our static assertions in zig_llvm.cpp. When implementing a fix for that, I realized that we don't even need a lot of the stuff we have in zig_llvm.(cpp,h) anymore. This commit trims the interface down considerably.

6 files changed, 97 insertions(+), 746 deletions(-)

src/codegen/llvm.zig+4-1
......@@ -1363,7 +1363,10 @@ pub const Object = struct {
13631363 .large => .Large,
13641364 };
13651365
1366 const float_abi: llvm.ABIType = if (comp.root_mod.resolved_target.result.floatAbi() == .hard) .Hard else .Soft;
1366 const float_abi: llvm.TargetMachine.FloatABI = if (comp.root_mod.resolved_target.result.floatAbi() == .hard)
1367 .Hard
1368 else
1369 .Soft;
13671370
13681371 var target_machine = llvm.TargetMachine.create(
13691372 target,
src/codegen/llvm/bindings.zig+20-131
......@@ -57,6 +57,15 @@ pub const disposeMessage = LLVMDisposeMessage;
5757extern fn LLVMDisposeMessage(Message: [*:0]const u8) void;
5858
5959pub const TargetMachine = opaque {
60 pub const FloatABI = enum(c_int) {
61 /// Target-specific (either soft or hard depending on triple, etc).
62 Default,
63 /// Soft float.
64 Soft,
65 // Hard float.
66 Hard,
67 };
68
6069 pub const create = ZigLLVMCreateTargetMachine;
6170 extern fn ZigLLVMCreateTargetMachine(
6271 T: *Target,
......@@ -68,7 +77,7 @@ pub const TargetMachine = opaque {
6877 CodeModel: CodeModel,
6978 function_sections: bool,
7079 data_sections: bool,
71 float_abi: ABIType,
80 float_abi: FloatABI,
7281 abi_name: ?[*:0]const u8,
7382 ) *TargetMachine;
7483
......@@ -108,7 +117,7 @@ pub const TargetMachine = opaque {
108117 TraceStores: bool,
109118 CollectControlFlow: bool,
110119
111 pub const Type = enum(c_uint) {
120 pub const Type = enum(c_int) {
112121 None = 0,
113122 Function,
114123 BB,
......@@ -166,15 +175,6 @@ pub const RelocMode = enum(c_int) {
166175 ROPI_RWPI,
167176};
168177
169pub const ABIType = enum(c_int) {
170 /// Target-specific (either soft or hard depending on triple, etc).
171 Default,
172 /// Soft float.
173 Soft,
174 // Hard float.
175 Hard,
176};
177
178178pub const Target = opaque {
179179 pub const getFromTriple = LLVMGetTargetFromTriple;
180180 extern fn LLVMGetTargetFromTriple(Triple: [*:0]const u8, T: **Target, ErrorMessage: *[*:0]const u8) Bool;
......@@ -303,16 +303,14 @@ pub const LinkCOFF = ZigLLDLinkCOFF;
303303pub const LinkELF = ZigLLDLinkELF;
304304pub const LinkWasm = ZigLLDLinkWasm;
305305
306pub const ObjectFormatType = enum(c_int) {
307 Unknown,
306pub const ArchiveKind = enum(c_int) {
307 GNU,
308 GNU64,
309 BSD,
310 DARWIN,
311 DARWIN64,
308312 COFF,
309 DXContainer,
310 ELF,
311 GOFF,
312 MachO,
313 SPIRV,
314 Wasm,
315 XCOFF,
313 AIXBIG,
316314};
317315
318316pub const WriteArchive = ZigLLVMWriteArchive;
......@@ -320,125 +318,16 @@ extern fn ZigLLVMWriteArchive(
320318 archive_name: [*:0]const u8,
321319 file_names_ptr: [*]const [*:0]const u8,
322320 file_names_len: usize,
323 os_type: OSType,
321 archive_kind: ArchiveKind,
324322) bool;
325323
326pub const OSType = enum(c_int) {
327 UnknownOS,
328 Darwin,
329 DragonFly,
330 FreeBSD,
331 Fuchsia,
332 IOS,
333 KFreeBSD,
334 Linux,
335 Lv2,
336 MacOSX,
337 NetBSD,
338 OpenBSD,
339 Solaris,
340 UEFI,
341 Win32,
342 ZOS,
343 Haiku,
344 RTEMS,
345 NaCl,
346 AIX,
347 CUDA,
348 NVCL,
349 AMDHSA,
350 PS4,
351 PS5,
352 ELFIAMCU,
353 TvOS,
354 WatchOS,
355 BridgeOS,
356 DriverKit,
357 XROS,
358 Mesa3D,
359 AMDPAL,
360 HermitCore,
361 Hurd,
362 WASI,
363 Emscripten,
364 ShaderModel,
365 LiteOS,
366 Serenity,
367 Vulkan,
368};
369
370pub const ArchType = enum(c_int) {
371 UnknownArch,
372 arm,
373 armeb,
374 aarch64,
375 aarch64_be,
376 aarch64_32,
377 arc,
378 avr,
379 bpfel,
380 bpfeb,
381 csky,
382 dxil,
383 hexagon,
384 loongarch32,
385 loongarch64,
386 m68k,
387 mips,
388 mipsel,
389 mips64,
390 mips64el,
391 msp430,
392 ppc,
393 ppcle,
394 ppc64,
395 ppc64le,
396 r600,
397 amdgcn,
398 riscv32,
399 riscv64,
400 sparc,
401 sparcv9,
402 sparcel,
403 systemz,
404 tce,
405 tcele,
406 thumb,
407 thumbeb,
408 x86,
409 x86_64,
410 xcore,
411 xtensa,
412 nvptx,
413 nvptx64,
414 le32,
415 le64,
416 amdil,
417 amdil64,
418 hsail,
419 hsail64,
420 spir,
421 spir64,
422 spirv,
423 spirv32,
424 spirv64,
425 kalimba,
426 shave,
427 lanai,
428 wasm32,
429 wasm64,
430 renderscript32,
431 renderscript64,
432 ve,
433};
434
435324pub const ParseCommandLineOptions = ZigLLVMParseCommandLineOptions;
436325extern fn ZigLLVMParseCommandLineOptions(argc: usize, argv: [*]const [*:0]const u8) void;
437326
438327pub const WriteImportLibrary = ZigLLVMWriteImportLibrary;
439328extern fn ZigLLVMWriteImportLibrary(
440329 def_path: [*:0]const u8,
441 arch: ArchType,
330 coff_machine: c_uint,
442331 output_lib_path: [*:0]const u8,
443332 kill_at: bool,
444333) bool;
src/link.zig+12-2
......@@ -1209,8 +1209,18 @@ pub const File = struct {
12091209 const llvm = @import("codegen/llvm.zig");
12101210 const target = comp.root_mod.resolved_target.result;
12111211 llvm.initializeLLVMTarget(target.cpu.arch);
1212 const os_tag = llvm.targetOs(target.os.tag);
1213 const bad = llvm_bindings.WriteArchive(full_out_path_z, object_files.items.ptr, object_files.items.len, os_tag);
1212 const bad = llvm_bindings.WriteArchive(
1213 full_out_path_z,
1214 object_files.items.ptr,
1215 object_files.items.len,
1216 switch (target.os.tag) {
1217 .linux => .GNU,
1218 .freebsd, .openbsd => .BSD,
1219 .macos, .ios => .DARWIN,
1220 .windows => .GNU,
1221 else => .GNU,
1222 },
1223 );
12141224 if (bad) return error.UnableToWriteArchive;
12151225
12161226 if (!base.disable_lld_caching) {
src/mingw.zig+12-3
......@@ -279,11 +279,20 @@ pub fn buildImportLib(comp: *Compilation, lib_name: []const u8) !void {
279279
280280 if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;
281281 const llvm_bindings = @import("codegen/llvm/bindings.zig");
282 const llvm = @import("codegen/llvm.zig");
283 const arch_tag = llvm.targetArch(target.cpu.arch);
284282 const def_final_path_z = try arena.dupeZ(u8, def_final_path);
285283 const lib_final_path_z = try comp.global_cache_directory.joinZ(arena, &.{lib_final_path});
286 if (llvm_bindings.WriteImportLibrary(def_final_path_z.ptr, arch_tag, lib_final_path_z.ptr, true)) {
284 if (llvm_bindings.WriteImportLibrary(
285 def_final_path_z.ptr,
286 @intFromEnum(@as(std.coff.MachineType, switch (target.cpu.arch) {
287 .arm, .armeb, .thumb, .thumbeb => .ARMNT,
288 .aarch64, .aarch64_be => .ARM64,
289 .x86 => .I386,
290 .x86_64 => .X64,
291 else => unreachable,
292 })),
293 lib_final_path_z.ptr,
294 true,
295 )) {
287296 // TODO surface a proper error here
288297 log.err("unable to turn {s}.def into {s}.lib", .{ lib_name, lib_name });
289298 return error.WritingImportLibFailed;
src/zig_llvm.cpp+23-291
......@@ -50,6 +50,7 @@
5050#include <llvm/Support/Timer.h>
5151#include <llvm/Support/raw_ostream.h>
5252#include <llvm/Target/TargetMachine.h>
53#include <llvm/Target/TargetOptions.h>
5354#include <llvm/Target/CodeGenCWrappers.h>
5455#include <llvm/Transforms/IPO.h>
5556#include <llvm/Transforms/IPO/AlwaysInliner.h>
......@@ -81,7 +82,7 @@ static const bool assertions_on = false;
8182
8283LLVMTargetMachineRef ZigLLVMCreateTargetMachine(LLVMTargetRef T, const char *Triple,
8384 const char *CPU, const char *Features, LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc,
84 LLVMCodeModel CodeModel, bool function_sections, bool data_sections, ZigLLVMABIType float_abi,
85 LLVMCodeModel CodeModel, bool function_sections, bool data_sections, ZigLLVMFloatABI float_abi,
8586 const char *abi_name)
8687{
8788 std::optional<Reloc::Model> RM;
......@@ -133,13 +134,13 @@ LLVMTargetMachineRef ZigLLVMCreateTargetMachine(LLVMTargetRef T, const char *Tri
133134 opt.FunctionSections = function_sections;
134135 opt.DataSections = data_sections;
135136 switch (float_abi) {
136 case ZigLLVMABITypeDefault:
137 case ZigLLVMFloatABI_Default:
137138 opt.FloatABIType = FloatABI::Default;
138139 break;
139 case ZigLLVMABITypeSoft:
140 case ZigLLVMFloatABI_Soft:
140141 opt.FloatABIType = FloatABI::Soft;
141142 break;
142 case ZigLLVMABITypeHard:
143 case ZigLLVMFloatABI_Hard:
143144 opt.FloatABIType = FloatABI::Hard;
144145 break;
145146 }
......@@ -213,7 +214,7 @@ static SanitizerCoverageOptions getSanCovOptions(ZigLLVMCoverageOptions z) {
213214}
214215
215216ZIG_EXTERN_C bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref,
216 char **error_message, const struct ZigLLVMEmitOptions *options)
217 char **error_message, const ZigLLVMEmitOptions *options)
217218{
218219 TimePassesIsEnabled = options->time_report;
219220
......@@ -419,7 +420,7 @@ struct ZigDiagnosticHandler : public DiagnosticHandler {
419420 BrokenDebugInfo = true;
420421 }
421422 return false;
422 }
423 }
423424};
424425
425426void ZigLLVMEnableBrokenDebugInfoCheck(LLVMContextRef context_ref) {
......@@ -435,35 +436,10 @@ void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv) {
435436 cl::ParseCommandLineOptions(argc, argv);
436437}
437438
438bool ZigLLVMWriteImportLibrary(const char *def_path, const ZigLLVM_ArchType arch,
439 const char *output_lib_path, bool kill_at)
439bool ZigLLVMWriteImportLibrary(const char *def_path, unsigned int coff_machine,
440 const char *output_lib_path, bool kill_at)
440441{
441 COFF::MachineTypes machine = COFF::IMAGE_FILE_MACHINE_UNKNOWN;
442
443 switch (arch) {
444 case ZigLLVM_x86:
445 machine = COFF::IMAGE_FILE_MACHINE_I386;
446 break;
447 case ZigLLVM_x86_64:
448 machine = COFF::IMAGE_FILE_MACHINE_AMD64;
449 break;
450 case ZigLLVM_arm:
451 case ZigLLVM_armeb:
452 case ZigLLVM_thumb:
453 case ZigLLVM_thumbeb:
454 machine = COFF::IMAGE_FILE_MACHINE_ARMNT;
455 break;
456 case ZigLLVM_aarch64:
457 case ZigLLVM_aarch64_be:
458 machine = COFF::IMAGE_FILE_MACHINE_ARM64;
459 break;
460 default:
461 break;
462 }
463
464 if (machine == COFF::IMAGE_FILE_MACHINE_UNKNOWN) {
465 return true;
466 }
442 COFF::MachineTypes machine = static_cast<COFF::MachineTypes>(coff_machine);
467443
468444 auto bufOrErr = MemoryBuffer::getFile(def_path);
469445 if (!bufOrErr) {
......@@ -515,30 +491,8 @@ bool ZigLLVMWriteImportLibrary(const char *def_path, const ZigLLVM_ArchType arch
515491}
516492
517493bool ZigLLVMWriteArchive(const char *archive_name, const char **file_names, size_t file_name_count,
518 ZigLLVM_OSType os_type)
494 ZigLLVMArchiveKind archive_kind)
519495{
520 object::Archive::Kind kind;
521 switch (os_type) {
522 case ZigLLVM_Win32:
523 // For some reason llvm-lib passes K_GNU on windows.
524 // See lib/ToolDrivers/llvm-lib/LibDriver.cpp:168 in libDriverMain
525 kind = object::Archive::K_GNU;
526 break;
527 case ZigLLVM_Linux:
528 kind = object::Archive::K_GNU;
529 break;
530 case ZigLLVM_MacOSX:
531 case ZigLLVM_Darwin:
532 case ZigLLVM_IOS:
533 kind = object::Archive::K_DARWIN;
534 break;
535 case ZigLLVM_OpenBSD:
536 case ZigLLVM_FreeBSD:
537 kind = object::Archive::K_BSD;
538 break;
539 default:
540 kind = object::Archive::K_GNU;
541 }
542496 SmallVector<NewArchiveMember, 4> new_members;
543497 for (size_t i = 0; i < file_name_count; i += 1) {
544498 Expected<NewArchiveMember> new_member = NewArchiveMember::getFile(file_names[i], true);
......@@ -547,7 +501,7 @@ bool ZigLLVMWriteArchive(const char *archive_name, const char **file_names, size
547501 new_members.push_back(std::move(*new_member));
548502 }
549503 Error err = writeArchive(archive_name, new_members,
550 SymtabWritingMode::NormalSymtab, kind, true, false, nullptr);
504 SymtabWritingMode::NormalSymtab, static_cast<object::Archive::Kind>(archive_kind), true, false, nullptr);
551505
552506 if (err) return true;
553507 return false;
......@@ -586,236 +540,14 @@ bool ZigLLDLinkWasm(int argc, const char **argv, bool can_exit_early, bool disab
586540 return lld::wasm::link(args, llvm::outs(), llvm::errs(), can_exit_early, disable_output);
587541}
588542
589static_assert((Triple::ArchType)ZigLLVM_UnknownArch == Triple::UnknownArch, "");
590static_assert((Triple::ArchType)ZigLLVM_arm == Triple::arm, "");
591static_assert((Triple::ArchType)ZigLLVM_armeb == Triple::armeb, "");
592static_assert((Triple::ArchType)ZigLLVM_aarch64 == Triple::aarch64, "");
593static_assert((Triple::ArchType)ZigLLVM_aarch64_be == Triple::aarch64_be, "");
594static_assert((Triple::ArchType)ZigLLVM_aarch64_32 == Triple::aarch64_32, "");
595static_assert((Triple::ArchType)ZigLLVM_arc == Triple::arc, "");
596static_assert((Triple::ArchType)ZigLLVM_avr == Triple::avr, "");
597static_assert((Triple::ArchType)ZigLLVM_bpfel == Triple::bpfel, "");
598static_assert((Triple::ArchType)ZigLLVM_bpfeb == Triple::bpfeb, "");
599static_assert((Triple::ArchType)ZigLLVM_csky == Triple::csky, "");
600static_assert((Triple::ArchType)ZigLLVM_hexagon == Triple::hexagon, "");
601static_assert((Triple::ArchType)ZigLLVM_m68k == Triple::m68k, "");
602static_assert((Triple::ArchType)ZigLLVM_mips == Triple::mips, "");
603static_assert((Triple::ArchType)ZigLLVM_mipsel == Triple::mipsel, "");
604static_assert((Triple::ArchType)ZigLLVM_mips64 == Triple::mips64, "");
605static_assert((Triple::ArchType)ZigLLVM_mips64el == Triple::mips64el, "");
606static_assert((Triple::ArchType)ZigLLVM_msp430 == Triple::msp430, "");
607static_assert((Triple::ArchType)ZigLLVM_ppc == Triple::ppc, "");
608static_assert((Triple::ArchType)ZigLLVM_ppcle == Triple::ppcle, "");
609static_assert((Triple::ArchType)ZigLLVM_ppc64 == Triple::ppc64, "");
610static_assert((Triple::ArchType)ZigLLVM_ppc64le == Triple::ppc64le, "");
611static_assert((Triple::ArchType)ZigLLVM_r600 == Triple::r600, "");
612static_assert((Triple::ArchType)ZigLLVM_amdgcn == Triple::amdgcn, "");
613static_assert((Triple::ArchType)ZigLLVM_riscv32 == Triple::riscv32, "");
614static_assert((Triple::ArchType)ZigLLVM_riscv64 == Triple::riscv64, "");
615static_assert((Triple::ArchType)ZigLLVM_sparc == Triple::sparc, "");
616static_assert((Triple::ArchType)ZigLLVM_sparcv9 == Triple::sparcv9, "");
617static_assert((Triple::ArchType)ZigLLVM_sparcel == Triple::sparcel, "");
618static_assert((Triple::ArchType)ZigLLVM_systemz == Triple::systemz, "");
619static_assert((Triple::ArchType)ZigLLVM_tce == Triple::tce, "");
620static_assert((Triple::ArchType)ZigLLVM_tcele == Triple::tcele, "");
621static_assert((Triple::ArchType)ZigLLVM_thumb == Triple::thumb, "");
622static_assert((Triple::ArchType)ZigLLVM_thumbeb == Triple::thumbeb, "");
623static_assert((Triple::ArchType)ZigLLVM_x86 == Triple::x86, "");
624static_assert((Triple::ArchType)ZigLLVM_x86_64 == Triple::x86_64, "");
625static_assert((Triple::ArchType)ZigLLVM_xcore == Triple::xcore, "");
626static_assert((Triple::ArchType)ZigLLVM_xtensa == Triple::xtensa, "");
627static_assert((Triple::ArchType)ZigLLVM_nvptx == Triple::nvptx, "");
628static_assert((Triple::ArchType)ZigLLVM_nvptx64 == Triple::nvptx64, "");
629static_assert((Triple::ArchType)ZigLLVM_le32 == Triple::le32, "");
630static_assert((Triple::ArchType)ZigLLVM_le64 == Triple::le64, "");
631static_assert((Triple::ArchType)ZigLLVM_amdil == Triple::amdil, "");
632static_assert((Triple::ArchType)ZigLLVM_amdil64 == Triple::amdil64, "");
633static_assert((Triple::ArchType)ZigLLVM_hsail == Triple::hsail, "");
634static_assert((Triple::ArchType)ZigLLVM_hsail64 == Triple::hsail64, "");
635static_assert((Triple::ArchType)ZigLLVM_spir == Triple::spir, "");
636static_assert((Triple::ArchType)ZigLLVM_spir64 == Triple::spir64, "");
637static_assert((Triple::ArchType)ZigLLVM_spirv == Triple::spirv, "");
638static_assert((Triple::ArchType)ZigLLVM_spirv32 == Triple::spirv32, "");
639static_assert((Triple::ArchType)ZigLLVM_spirv64 == Triple::spirv64, "");
640static_assert((Triple::ArchType)ZigLLVM_kalimba == Triple::kalimba, "");
641static_assert((Triple::ArchType)ZigLLVM_shave == Triple::shave, "");
642static_assert((Triple::ArchType)ZigLLVM_lanai == Triple::lanai, "");
643static_assert((Triple::ArchType)ZigLLVM_wasm32 == Triple::wasm32, "");
644static_assert((Triple::ArchType)ZigLLVM_wasm64 == Triple::wasm64, "");
645static_assert((Triple::ArchType)ZigLLVM_renderscript32 == Triple::renderscript32, "");
646static_assert((Triple::ArchType)ZigLLVM_renderscript64 == Triple::renderscript64, "");
647static_assert((Triple::ArchType)ZigLLVM_ve == Triple::ve, "");
648static_assert((Triple::ArchType)ZigLLVM_LastArchType == Triple::LastArchType, "");
649
650static_assert((Triple::VendorType)ZigLLVM_UnknownVendor == Triple::UnknownVendor, "");
651static_assert((Triple::VendorType)ZigLLVM_Apple == Triple::Apple, "");
652static_assert((Triple::VendorType)ZigLLVM_PC == Triple::PC, "");
653static_assert((Triple::VendorType)ZigLLVM_SCEI == Triple::SCEI, "");
654static_assert((Triple::VendorType)ZigLLVM_Freescale == Triple::Freescale, "");
655static_assert((Triple::VendorType)ZigLLVM_IBM == Triple::IBM, "");
656static_assert((Triple::VendorType)ZigLLVM_ImaginationTechnologies == Triple::ImaginationTechnologies, "");
657static_assert((Triple::VendorType)ZigLLVM_MipsTechnologies == Triple::MipsTechnologies, "");
658static_assert((Triple::VendorType)ZigLLVM_NVIDIA == Triple::NVIDIA, "");
659static_assert((Triple::VendorType)ZigLLVM_CSR == Triple::CSR, "");
660static_assert((Triple::VendorType)ZigLLVM_AMD == Triple::AMD, "");
661static_assert((Triple::VendorType)ZigLLVM_Mesa == Triple::Mesa, "");
662static_assert((Triple::VendorType)ZigLLVM_SUSE == Triple::SUSE, "");
663static_assert((Triple::VendorType)ZigLLVM_OpenEmbedded == Triple::OpenEmbedded, "");
664static_assert((Triple::VendorType)ZigLLVM_LastVendorType == Triple::LastVendorType, "");
665
666static_assert((Triple::OSType)ZigLLVM_UnknownOS == Triple::UnknownOS, "");
667static_assert((Triple::OSType)ZigLLVM_Darwin == Triple::Darwin, "");
668static_assert((Triple::OSType)ZigLLVM_DragonFly == Triple::DragonFly, "");
669static_assert((Triple::OSType)ZigLLVM_FreeBSD == Triple::FreeBSD, "");
670static_assert((Triple::OSType)ZigLLVM_Fuchsia == Triple::Fuchsia, "");
671static_assert((Triple::OSType)ZigLLVM_IOS == Triple::IOS, "");
672// Commented out to work around a Debian/Ubuntu bug.
673// See https://github.com/ziglang/zig/issues/2076
674//static_assert((Triple::OSType)ZigLLVM_KFreeBSD == Triple::KFreeBSD, "");
675static_assert((Triple::OSType)ZigLLVM_Linux == Triple::Linux, "");
676static_assert((Triple::OSType)ZigLLVM_Lv2 == Triple::Lv2, "");
677static_assert((Triple::OSType)ZigLLVM_MacOSX == Triple::MacOSX, "");
678static_assert((Triple::OSType)ZigLLVM_NetBSD == Triple::NetBSD, "");
679static_assert((Triple::OSType)ZigLLVM_OpenBSD == Triple::OpenBSD, "");
680static_assert((Triple::OSType)ZigLLVM_Solaris == Triple::Solaris, "");
681static_assert((Triple::OSType)ZigLLVM_UEFI == Triple::UEFI, "");
682static_assert((Triple::OSType)ZigLLVM_Win32 == Triple::Win32, "");
683static_assert((Triple::OSType)ZigLLVM_ZOS == Triple::ZOS, "");
684static_assert((Triple::OSType)ZigLLVM_Haiku == Triple::Haiku, "");
685static_assert((Triple::OSType)ZigLLVM_RTEMS == Triple::RTEMS, "");
686static_assert((Triple::OSType)ZigLLVM_NaCl == Triple::NaCl, "");
687static_assert((Triple::OSType)ZigLLVM_AIX == Triple::AIX, "");
688static_assert((Triple::OSType)ZigLLVM_CUDA == Triple::CUDA, "");
689static_assert((Triple::OSType)ZigLLVM_NVCL == Triple::NVCL, "");
690static_assert((Triple::OSType)ZigLLVM_AMDHSA == Triple::AMDHSA, "");
691static_assert((Triple::OSType)ZigLLVM_PS4 == Triple::PS4, "");
692static_assert((Triple::OSType)ZigLLVM_ELFIAMCU == Triple::ELFIAMCU, "");
693static_assert((Triple::OSType)ZigLLVM_TvOS == Triple::TvOS, "");
694static_assert((Triple::OSType)ZigLLVM_WatchOS == Triple::WatchOS, "");
695static_assert((Triple::OSType)ZigLLVM_BridgeOS == Triple::BridgeOS, "");
696static_assert((Triple::OSType)ZigLLVM_DriverKit == Triple::DriverKit, "");
697static_assert((Triple::OSType)ZigLLVM_XROS == Triple::XROS, "");
698static_assert((Triple::OSType)ZigLLVM_Mesa3D == Triple::Mesa3D, "");
699static_assert((Triple::OSType)ZigLLVM_AMDPAL == Triple::AMDPAL, "");
700static_assert((Triple::OSType)ZigLLVM_HermitCore == Triple::HermitCore, "");
701static_assert((Triple::OSType)ZigLLVM_Hurd == Triple::Hurd, "");
702static_assert((Triple::OSType)ZigLLVM_WASI == Triple::WASI, "");
703static_assert((Triple::OSType)ZigLLVM_Emscripten == Triple::Emscripten, "");
704static_assert((Triple::OSType)ZigLLVM_ShaderModel == Triple::ShaderModel, "");
705static_assert((Triple::OSType)ZigLLVM_LiteOS == Triple::LiteOS, "");
706static_assert((Triple::OSType)ZigLLVM_Serenity == Triple::Serenity, "");
707static_assert((Triple::OSType)ZigLLVM_Vulkan == Triple::Vulkan, "");
708static_assert((Triple::OSType)ZigLLVM_LastOSType == Triple::LastOSType, "");
709
710static_assert((Triple::EnvironmentType)ZigLLVM_UnknownEnvironment == Triple::UnknownEnvironment, "");
711static_assert((Triple::EnvironmentType)ZigLLVM_GNU == Triple::GNU, "");
712static_assert((Triple::EnvironmentType)ZigLLVM_GNUABIN32 == Triple::GNUABIN32, "");
713static_assert((Triple::EnvironmentType)ZigLLVM_GNUABI64 == Triple::GNUABI64, "");
714static_assert((Triple::EnvironmentType)ZigLLVM_GNUEABI == Triple::GNUEABI, "");
715static_assert((Triple::EnvironmentType)ZigLLVM_GNUEABIHF == Triple::GNUEABIHF, "");
716static_assert((Triple::EnvironmentType)ZigLLVM_GNUF32 == Triple::GNUF32, "");
717static_assert((Triple::EnvironmentType)ZigLLVM_GNUF64 == Triple::GNUF64, "");
718static_assert((Triple::EnvironmentType)ZigLLVM_GNUSF == Triple::GNUSF, "");
719static_assert((Triple::EnvironmentType)ZigLLVM_GNUX32 == Triple::GNUX32, "");
720static_assert((Triple::EnvironmentType)ZigLLVM_GNUILP32 == Triple::GNUILP32, "");
721static_assert((Triple::EnvironmentType)ZigLLVM_CODE16 == Triple::CODE16, "");
722static_assert((Triple::EnvironmentType)ZigLLVM_EABI == Triple::EABI, "");
723static_assert((Triple::EnvironmentType)ZigLLVM_EABIHF == Triple::EABIHF, "");
724static_assert((Triple::EnvironmentType)ZigLLVM_Android == Triple::Android, "");
725static_assert((Triple::EnvironmentType)ZigLLVM_Musl == Triple::Musl, "");
726static_assert((Triple::EnvironmentType)ZigLLVM_MuslEABI == Triple::MuslEABI, "");
727static_assert((Triple::EnvironmentType)ZigLLVM_MuslEABIHF == Triple::MuslEABIHF, "");
728static_assert((Triple::EnvironmentType)ZigLLVM_MuslX32 == Triple::MuslX32, "");
729static_assert((Triple::EnvironmentType)ZigLLVM_MSVC == Triple::MSVC, "");
730static_assert((Triple::EnvironmentType)ZigLLVM_Itanium == Triple::Itanium, "");
731static_assert((Triple::EnvironmentType)ZigLLVM_Cygnus == Triple::Cygnus, "");
732static_assert((Triple::EnvironmentType)ZigLLVM_CoreCLR == Triple::CoreCLR, "");
733static_assert((Triple::EnvironmentType)ZigLLVM_Simulator == Triple::Simulator, "");
734static_assert((Triple::EnvironmentType)ZigLLVM_MacABI == Triple::MacABI, "");
735static_assert((Triple::EnvironmentType)ZigLLVM_Pixel == Triple::Pixel, "");
736static_assert((Triple::EnvironmentType)ZigLLVM_Vertex == Triple::Vertex, "");
737static_assert((Triple::EnvironmentType)ZigLLVM_Geometry == Triple::Geometry, "");
738static_assert((Triple::EnvironmentType)ZigLLVM_Hull == Triple::Hull, "");
739static_assert((Triple::EnvironmentType)ZigLLVM_Domain == Triple::Domain, "");
740static_assert((Triple::EnvironmentType)ZigLLVM_Compute == Triple::Compute, "");
741static_assert((Triple::EnvironmentType)ZigLLVM_Library == Triple::Library, "");
742static_assert((Triple::EnvironmentType)ZigLLVM_RayGeneration == Triple::RayGeneration, "");
743static_assert((Triple::EnvironmentType)ZigLLVM_Intersection == Triple::Intersection, "");
744static_assert((Triple::EnvironmentType)ZigLLVM_AnyHit == Triple::AnyHit, "");
745static_assert((Triple::EnvironmentType)ZigLLVM_ClosestHit == Triple::ClosestHit, "");
746static_assert((Triple::EnvironmentType)ZigLLVM_Miss == Triple::Miss, "");
747static_assert((Triple::EnvironmentType)ZigLLVM_Callable == Triple::Callable, "");
748static_assert((Triple::EnvironmentType)ZigLLVM_Mesh == Triple::Mesh, "");
749static_assert((Triple::EnvironmentType)ZigLLVM_Amplification == Triple::Amplification, "");
750static_assert((Triple::EnvironmentType)ZigLLVM_OpenCL == Triple::OpenCL, "");
751static_assert((Triple::EnvironmentType)ZigLLVM_OpenHOS == Triple::OpenHOS, "");
752static_assert((Triple::EnvironmentType)ZigLLVM_PAuthTest == Triple::PAuthTest, "");
753static_assert((Triple::EnvironmentType)ZigLLVM_LastEnvironmentType == Triple::LastEnvironmentType, "");
754
755static_assert((Triple::ObjectFormatType)ZigLLVM_UnknownObjectFormat == Triple::UnknownObjectFormat, "");
756static_assert((Triple::ObjectFormatType)ZigLLVM_COFF == Triple::COFF, "");
757static_assert((Triple::ObjectFormatType)ZigLLVM_ELF == Triple::ELF, "");
758static_assert((Triple::ObjectFormatType)ZigLLVM_GOFF == Triple::GOFF, "");
759static_assert((Triple::ObjectFormatType)ZigLLVM_MachO == Triple::MachO, "");
760static_assert((Triple::ObjectFormatType)ZigLLVM_Wasm == Triple::Wasm, "");
761static_assert((Triple::ObjectFormatType)ZigLLVM_XCOFF == Triple::XCOFF, "");
762
763static_assert((CallingConv::ID)ZigLLVM_C == llvm::CallingConv::C, "");
764static_assert((CallingConv::ID)ZigLLVM_Fast == llvm::CallingConv::Fast, "");
765static_assert((CallingConv::ID)ZigLLVM_Cold == llvm::CallingConv::Cold, "");
766static_assert((CallingConv::ID)ZigLLVM_GHC == llvm::CallingConv::GHC, "");
767static_assert((CallingConv::ID)ZigLLVM_HiPE == llvm::CallingConv::HiPE, "");
768static_assert((CallingConv::ID)ZigLLVM_AnyReg == llvm::CallingConv::AnyReg, "");
769static_assert((CallingConv::ID)ZigLLVM_PreserveMost == llvm::CallingConv::PreserveMost, "");
770static_assert((CallingConv::ID)ZigLLVM_PreserveAll == llvm::CallingConv::PreserveAll, "");
771static_assert((CallingConv::ID)ZigLLVM_Swift == llvm::CallingConv::Swift, "");
772static_assert((CallingConv::ID)ZigLLVM_CXX_FAST_TLS == llvm::CallingConv::CXX_FAST_TLS, "");
773static_assert((CallingConv::ID)ZigLLVM_Tail == llvm::CallingConv::Tail, "");
774static_assert((CallingConv::ID)ZigLLVM_CFGuard_Check == llvm::CallingConv::CFGuard_Check, "");
775static_assert((CallingConv::ID)ZigLLVM_SwiftTail == llvm::CallingConv::SwiftTail, "");
776static_assert((CallingConv::ID)ZigLLVM_FirstTargetCC == llvm::CallingConv::FirstTargetCC, "");
777static_assert((CallingConv::ID)ZigLLVM_X86_StdCall == llvm::CallingConv::X86_StdCall, "");
778static_assert((CallingConv::ID)ZigLLVM_X86_FastCall == llvm::CallingConv::X86_FastCall, "");
779static_assert((CallingConv::ID)ZigLLVM_ARM_APCS == llvm::CallingConv::ARM_APCS, "");
780static_assert((CallingConv::ID)ZigLLVM_ARM_AAPCS == llvm::CallingConv::ARM_AAPCS, "");
781static_assert((CallingConv::ID)ZigLLVM_ARM_AAPCS_VFP == llvm::CallingConv::ARM_AAPCS_VFP, "");
782static_assert((CallingConv::ID)ZigLLVM_MSP430_INTR == llvm::CallingConv::MSP430_INTR, "");
783static_assert((CallingConv::ID)ZigLLVM_X86_ThisCall == llvm::CallingConv::X86_ThisCall, "");
784static_assert((CallingConv::ID)ZigLLVM_PTX_Kernel == llvm::CallingConv::PTX_Kernel, "");
785static_assert((CallingConv::ID)ZigLLVM_PTX_Device == llvm::CallingConv::PTX_Device, "");
786static_assert((CallingConv::ID)ZigLLVM_SPIR_FUNC == llvm::CallingConv::SPIR_FUNC, "");
787static_assert((CallingConv::ID)ZigLLVM_SPIR_KERNEL == llvm::CallingConv::SPIR_KERNEL, "");
788static_assert((CallingConv::ID)ZigLLVM_Intel_OCL_BI == llvm::CallingConv::Intel_OCL_BI, "");
789static_assert((CallingConv::ID)ZigLLVM_X86_64_SysV == llvm::CallingConv::X86_64_SysV, "");
790static_assert((CallingConv::ID)ZigLLVM_Win64 == llvm::CallingConv::Win64, "");
791static_assert((CallingConv::ID)ZigLLVM_X86_VectorCall == llvm::CallingConv::X86_VectorCall, "");
792static_assert((CallingConv::ID)ZigLLVM_DUMMY_HHVM == llvm::CallingConv::DUMMY_HHVM, "");
793static_assert((CallingConv::ID)ZigLLVM_DUMMY_HHVM_C == llvm::CallingConv::DUMMY_HHVM_C, "");
794static_assert((CallingConv::ID)ZigLLVM_X86_INTR == llvm::CallingConv::X86_INTR, "");
795static_assert((CallingConv::ID)ZigLLVM_AVR_INTR == llvm::CallingConv::AVR_INTR, "");
796static_assert((CallingConv::ID)ZigLLVM_AVR_SIGNAL == llvm::CallingConv::AVR_SIGNAL, "");
797static_assert((CallingConv::ID)ZigLLVM_AVR_BUILTIN == llvm::CallingConv::AVR_BUILTIN, "");
798static_assert((CallingConv::ID)ZigLLVM_AMDGPU_VS == llvm::CallingConv::AMDGPU_VS, "");
799static_assert((CallingConv::ID)ZigLLVM_AMDGPU_GS == llvm::CallingConv::AMDGPU_GS, "");
800static_assert((CallingConv::ID)ZigLLVM_AMDGPU_PS == llvm::CallingConv::AMDGPU_PS, "");
801static_assert((CallingConv::ID)ZigLLVM_AMDGPU_CS == llvm::CallingConv::AMDGPU_CS, "");
802static_assert((CallingConv::ID)ZigLLVM_AMDGPU_KERNEL == llvm::CallingConv::AMDGPU_KERNEL, "");
803static_assert((CallingConv::ID)ZigLLVM_X86_RegCall == llvm::CallingConv::X86_RegCall, "");
804static_assert((CallingConv::ID)ZigLLVM_AMDGPU_HS == llvm::CallingConv::AMDGPU_HS, "");
805static_assert((CallingConv::ID)ZigLLVM_MSP430_BUILTIN == llvm::CallingConv::MSP430_BUILTIN, "");
806static_assert((CallingConv::ID)ZigLLVM_AMDGPU_LS == llvm::CallingConv::AMDGPU_LS, "");
807static_assert((CallingConv::ID)ZigLLVM_AMDGPU_ES == llvm::CallingConv::AMDGPU_ES, "");
808static_assert((CallingConv::ID)ZigLLVM_AArch64_VectorCall == llvm::CallingConv::AArch64_VectorCall, "");
809static_assert((CallingConv::ID)ZigLLVM_AArch64_SVE_VectorCall == llvm::CallingConv::AArch64_SVE_VectorCall, "");
810static_assert((CallingConv::ID)ZigLLVM_WASM_EmscriptenInvoke == llvm::CallingConv::WASM_EmscriptenInvoke, "");
811static_assert((CallingConv::ID)ZigLLVM_AMDGPU_Gfx == llvm::CallingConv::AMDGPU_Gfx, "");
812static_assert((CallingConv::ID)ZigLLVM_M68k_INTR == llvm::CallingConv::M68k_INTR, "");
813static_assert((CallingConv::ID)ZigLLVM_AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0 == llvm::CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0, "");
814static_assert((CallingConv::ID)ZigLLVM_AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2 == llvm::CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2, "");
815static_assert((CallingConv::ID)ZigLLVM_AMDGPU_CS_Chain == llvm::CallingConv::AMDGPU_CS_Chain, "");
816static_assert((CallingConv::ID)ZigLLVM_AMDGPU_CS_ChainPreserve == llvm::CallingConv::AMDGPU_CS_ChainPreserve, "");
817static_assert((CallingConv::ID)ZigLLVM_M68k_RTD == llvm::CallingConv::M68k_RTD, "");
818static_assert((CallingConv::ID)ZigLLVM_GRAAL == llvm::CallingConv::GRAAL, "");
819static_assert((CallingConv::ID)ZigLLVM_ARM64EC_Thunk_X64 == llvm::CallingConv::ARM64EC_Thunk_X64, "");
820static_assert((CallingConv::ID)ZigLLVM_ARM64EC_Thunk_Native == llvm::CallingConv::ARM64EC_Thunk_Native, "");
821static_assert((CallingConv::ID)ZigLLVM_MaxID == llvm::CallingConv::MaxID, "");
543static_assert((FloatABI::ABIType)ZigLLVMFloatABI_Default == FloatABI::ABIType::Default, "");
544static_assert((FloatABI::ABIType)ZigLLVMFloatABI_Soft == FloatABI::ABIType::Soft, "");
545static_assert((FloatABI::ABIType)ZigLLVMFloatABI_Hard == FloatABI::ABIType::Hard, "");
546
547static_assert((object::Archive::Kind)ZigLLVMArchiveKind_GNU == object::Archive::Kind::K_GNU, "");
548static_assert((object::Archive::Kind)ZigLLVMArchiveKind_GNU64 == object::Archive::Kind::K_GNU64, "");
549static_assert((object::Archive::Kind)ZigLLVMArchiveKind_BSD == object::Archive::Kind::K_BSD, "");
550static_assert((object::Archive::Kind)ZigLLVMArchiveKind_DARWIN == object::Archive::Kind::K_DARWIN, "");
551static_assert((object::Archive::Kind)ZigLLVMArchiveKind_DARWIN64 == object::Archive::Kind::K_DARWIN64, "");
552static_assert((object::Archive::Kind)ZigLLVMArchiveKind_COFF == object::Archive::Kind::K_COFF, "");
553static_assert((object::Archive::Kind)ZigLLVMArchiveKind_AIXBIG == object::Archive::Kind::K_AIXBIG, "");
src/zig_llvm.h+26-318
......@@ -24,7 +24,8 @@
2424// ATTENTION: If you modify this file, be sure to update the corresponding
2525// extern function declarations in the self-hosted compiler.
2626
27
27// synchronize with llvm/include/Transforms/Instrumentation.h::SanitizerCoverageOptions::Type
28// synchronize with codegen/llvm/bindings.zig::TargetMachine::EmitOptions::Coverage::Type
2829enum ZigLLVMCoverageType {
2930 ZigLLVMCoverageType_None = 0,
3031 ZigLLVMCoverageType_Function,
......@@ -67,18 +68,32 @@ struct ZigLLVMEmitOptions {
6768 ZigLLVMCoverageOptions coverage;
6869};
6970
70ZIG_EXTERN_C bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref,
71 char **error_message, const struct ZigLLVMEmitOptions *options);
71// synchronize with llvm/include/Object/Archive.h::Object::Archive::Kind
72// synchronize with codegen/llvm/bindings.zig::ArchiveKind
73enum ZigLLVMArchiveKind {
74 ZigLLVMArchiveKind_GNU,
75 ZigLLVMArchiveKind_GNU64,
76 ZigLLVMArchiveKind_BSD,
77 ZigLLVMArchiveKind_DARWIN,
78 ZigLLVMArchiveKind_DARWIN64,
79 ZigLLVMArchiveKind_COFF,
80 ZigLLVMArchiveKind_AIXBIG,
81};
7282
73enum ZigLLVMABIType {
74 ZigLLVMABITypeDefault, // Target-specific (either soft or hard depending on triple, etc).
75 ZigLLVMABITypeSoft, // Soft float.
76 ZigLLVMABITypeHard // Hard float.
83// synchronize with llvm/include/Target/TargetOptions.h::FloatABI::ABIType
84// synchronize with codegen/llvm/bindings.zig::TargetMachine::FloatABI
85enum ZigLLVMFloatABI {
86 ZigLLVMFloatABI_Default, // Target-specific (either soft or hard depending on triple, etc).
87 ZigLLVMFloatABI_Soft, // Soft float.
88 ZigLLVMFloatABI_Hard // Hard float.
7789};
7890
91ZIG_EXTERN_C bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref,
92 char **error_message, const ZigLLVMEmitOptions *options);
93
7994ZIG_EXTERN_C LLVMTargetMachineRef ZigLLVMCreateTargetMachine(LLVMTargetRef T, const char *Triple,
8095 const char *CPU, const char *Features, LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc,
81 LLVMCodeModel CodeModel, bool function_sections, bool data_sections, enum ZigLLVMABIType float_abi,
96 LLVMCodeModel CodeModel, bool function_sections, bool data_sections, ZigLLVMFloatABI float_abi,
8297 const char *abi_name);
8398
8499ZIG_EXTERN_C void ZigLLVMSetOptBisectLimit(LLVMContextRef context_ref, int limit);
......@@ -86,323 +101,16 @@ ZIG_EXTERN_C void ZigLLVMSetOptBisectLimit(LLVMContextRef context_ref, int limit
86101ZIG_EXTERN_C void ZigLLVMEnableBrokenDebugInfoCheck(LLVMContextRef context_ref);
87102ZIG_EXTERN_C bool ZigLLVMGetBrokenDebugInfo(LLVMContextRef context_ref);
88103
89enum ZigLLVMTailCallKind {
90 ZigLLVMTailCallKindNone,
91 ZigLLVMTailCallKindTail,
92 ZigLLVMTailCallKindMustTail,
93 ZigLLVMTailCallKindNoTail,
94};
95
96enum ZigLLVM_CallingConv {
97 ZigLLVM_C = 0,
98 ZigLLVM_Fast = 8,
99 ZigLLVM_Cold = 9,
100 ZigLLVM_GHC = 10,
101 ZigLLVM_HiPE = 11,
102 ZigLLVM_AnyReg = 13,
103 ZigLLVM_PreserveMost = 14,
104 ZigLLVM_PreserveAll = 15,
105 ZigLLVM_Swift = 16,
106 ZigLLVM_CXX_FAST_TLS = 17,
107 ZigLLVM_Tail = 18,
108 ZigLLVM_CFGuard_Check = 19,
109 ZigLLVM_SwiftTail = 20,
110 ZigLLVM_FirstTargetCC = 64,
111 ZigLLVM_X86_StdCall = 64,
112 ZigLLVM_X86_FastCall = 65,
113 ZigLLVM_ARM_APCS = 66,
114 ZigLLVM_ARM_AAPCS = 67,
115 ZigLLVM_ARM_AAPCS_VFP = 68,
116 ZigLLVM_MSP430_INTR = 69,
117 ZigLLVM_X86_ThisCall = 70,
118 ZigLLVM_PTX_Kernel = 71,
119 ZigLLVM_PTX_Device = 72,
120 ZigLLVM_SPIR_FUNC = 75,
121 ZigLLVM_SPIR_KERNEL = 76,
122 ZigLLVM_Intel_OCL_BI = 77,
123 ZigLLVM_X86_64_SysV = 78,
124 ZigLLVM_Win64 = 79,
125 ZigLLVM_X86_VectorCall = 80,
126 ZigLLVM_DUMMY_HHVM = 81,
127 ZigLLVM_DUMMY_HHVM_C = 82,
128 ZigLLVM_X86_INTR = 83,
129 ZigLLVM_AVR_INTR = 84,
130 ZigLLVM_AVR_SIGNAL = 85,
131 ZigLLVM_AVR_BUILTIN = 86,
132 ZigLLVM_AMDGPU_VS = 87,
133 ZigLLVM_AMDGPU_GS = 88,
134 ZigLLVM_AMDGPU_PS = 89,
135 ZigLLVM_AMDGPU_CS = 90,
136 ZigLLVM_AMDGPU_KERNEL = 91,
137 ZigLLVM_X86_RegCall = 92,
138 ZigLLVM_AMDGPU_HS = 93,
139 ZigLLVM_MSP430_BUILTIN = 94,
140 ZigLLVM_AMDGPU_LS = 95,
141 ZigLLVM_AMDGPU_ES = 96,
142 ZigLLVM_AArch64_VectorCall = 97,
143 ZigLLVM_AArch64_SVE_VectorCall = 98,
144 ZigLLVM_WASM_EmscriptenInvoke = 99,
145 ZigLLVM_AMDGPU_Gfx = 100,
146 ZigLLVM_M68k_INTR = 101,
147 ZigLLVM_AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0 = 102,
148 ZigLLVM_AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2 = 103,
149 ZigLLVM_AMDGPU_CS_Chain = 104,
150 ZigLLVM_AMDGPU_CS_ChainPreserve = 105,
151 ZigLLVM_M68k_RTD = 106,
152 ZigLLVM_GRAAL = 107,
153 ZigLLVM_ARM64EC_Thunk_X64 = 108,
154 ZigLLVM_ARM64EC_Thunk_Native = 109,
155 ZigLLVM_MaxID = 1023,
156};
157
158104ZIG_EXTERN_C void ZigLLVMParseCommandLineOptions(size_t argc, const char *const *argv);
159105
160// synchronize with llvm/include/ADT/Triple.h::ArchType
161// synchronize with std.Target.Cpu.Arch
162// synchronize with codegen/llvm/bindings.zig::ArchType
163enum ZigLLVM_ArchType {
164 ZigLLVM_UnknownArch,
165
166 ZigLLVM_arm, // ARM (little endian): arm, armv.*, xscale
167 ZigLLVM_armeb, // ARM (big endian): armeb
168 ZigLLVM_aarch64, // AArch64 (little endian): aarch64
169 ZigLLVM_aarch64_be, // AArch64 (big endian): aarch64_be
170 ZigLLVM_aarch64_32, // AArch64 (little endian) ILP32: aarch64_32
171 ZigLLVM_arc, // ARC: Synopsys ARC
172 ZigLLVM_avr, // AVR: Atmel AVR microcontroller
173 ZigLLVM_bpfel, // eBPF or extended BPF or 64-bit BPF (little endian)
174 ZigLLVM_bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian)
175 ZigLLVM_csky, // CSKY: csky
176 ZigLLVM_dxil, // DXIL 32-bit DirectX bytecode
177 ZigLLVM_hexagon, // Hexagon: hexagon
178 ZigLLVM_loongarch32, // LoongArch (32-bit): loongarch32
179 ZigLLVM_loongarch64, // LoongArch (64-bit): loongarch64
180 ZigLLVM_m68k, // M68k: Motorola 680x0 family
181 ZigLLVM_mips, // MIPS: mips, mipsallegrex, mipsr6
182 ZigLLVM_mipsel, // MIPSEL: mipsel, mipsallegrexe, mipsr6el
183 ZigLLVM_mips64, // MIPS64: mips64, mips64r6, mipsn32, mipsn32r6
184 ZigLLVM_mips64el, // MIPS64EL: mips64el, mips64r6el, mipsn32el, mipsn32r6el
185 ZigLLVM_msp430, // MSP430: msp430
186 ZigLLVM_ppc, // PPC: powerpc
187 ZigLLVM_ppcle, // PPCLE: powerpc (little endian)
188 ZigLLVM_ppc64, // PPC64: powerpc64, ppu
189 ZigLLVM_ppc64le, // PPC64LE: powerpc64le
190 ZigLLVM_r600, // R600: AMD GPUs HD2XXX - HD6XXX
191 ZigLLVM_amdgcn, // AMDGCN: AMD GCN GPUs
192 ZigLLVM_riscv32, // RISC-V (32-bit): riscv32
193 ZigLLVM_riscv64, // RISC-V (64-bit): riscv64
194 ZigLLVM_sparc, // Sparc: sparc
195 ZigLLVM_sparcv9, // Sparcv9: Sparcv9
196 ZigLLVM_sparcel, // Sparc: (endianness = little). NB: 'Sparcle' is a CPU variant
197 ZigLLVM_systemz, // SystemZ: s390x
198 ZigLLVM_tce, // TCE (http://tce.cs.tut.fi/): tce
199 ZigLLVM_tcele, // TCE little endian (http://tce.cs.tut.fi/): tcele
200 ZigLLVM_thumb, // Thumb (little endian): thumb, thumbv.*
201 ZigLLVM_thumbeb, // Thumb (big endian): thumbeb
202 ZigLLVM_x86, // X86: i[3-9]86
203 ZigLLVM_x86_64, // X86-64: amd64, x86_64
204 ZigLLVM_xcore, // XCore: xcore
205 ZigLLVM_xtensa, // Tensilica: Xtensa
206 ZigLLVM_nvptx, // NVPTX: 32-bit
207 ZigLLVM_nvptx64, // NVPTX: 64-bit
208 ZigLLVM_le32, // le32: generic little-endian 32-bit CPU (PNaCl)
209 ZigLLVM_le64, // le64: generic little-endian 64-bit CPU (PNaCl)
210 ZigLLVM_amdil, // AMDIL
211 ZigLLVM_amdil64, // AMDIL with 64-bit pointers
212 ZigLLVM_hsail, // AMD HSAIL
213 ZigLLVM_hsail64, // AMD HSAIL with 64-bit pointers
214 ZigLLVM_spir, // SPIR: standard portable IR for OpenCL 32-bit version
215 ZigLLVM_spir64, // SPIR: standard portable IR for OpenCL 64-bit version
216 ZigLLVM_spirv, // SPIR-V with logical memory layout.
217 ZigLLVM_spirv32, // SPIR-V with 32-bit pointers
218 ZigLLVM_spirv64, // SPIR-V with 64-bit pointers
219 ZigLLVM_kalimba, // Kalimba: generic kalimba
220 ZigLLVM_shave, // SHAVE: Movidius vector VLIW processors
221 ZigLLVM_lanai, // Lanai: Lanai 32-bit
222 ZigLLVM_wasm32, // WebAssembly with 32-bit pointers
223 ZigLLVM_wasm64, // WebAssembly with 64-bit pointers
224 ZigLLVM_renderscript32, // 32-bit RenderScript
225 ZigLLVM_renderscript64, // 64-bit RenderScript
226 ZigLLVM_ve, // NEC SX-Aurora Vector Engine
227 ZigLLVM_LastArchType = ZigLLVM_ve
228};
229
230enum ZigLLVM_VendorType {
231 ZigLLVM_UnknownVendor,
232
233 ZigLLVM_Apple,
234 ZigLLVM_PC,
235 ZigLLVM_SCEI,
236 ZigLLVM_Freescale,
237 ZigLLVM_IBM,
238 ZigLLVM_ImaginationTechnologies,
239 ZigLLVM_MipsTechnologies,
240 ZigLLVM_NVIDIA,
241 ZigLLVM_CSR,
242 ZigLLVM_AMD,
243 ZigLLVM_Mesa,
244 ZigLLVM_SUSE,
245 ZigLLVM_OpenEmbedded,
246
247 ZigLLVM_LastVendorType = ZigLLVM_OpenEmbedded
248};
249
250// synchronize with llvm/include/ADT/Triple.h::OsType
251// synchronize with std.Target.Os.Tag
252// synchronize with codegen/llvm/bindings.zig::OsType
253enum ZigLLVM_OSType {
254 ZigLLVM_UnknownOS,
255
256 ZigLLVM_Darwin,
257 ZigLLVM_DragonFly,
258 ZigLLVM_FreeBSD,
259 ZigLLVM_Fuchsia,
260 ZigLLVM_IOS,
261 ZigLLVM_KFreeBSD,
262 ZigLLVM_Linux,
263 ZigLLVM_Lv2, // PS3
264 ZigLLVM_MacOSX,
265 ZigLLVM_NetBSD,
266 ZigLLVM_OpenBSD,
267 ZigLLVM_Solaris,
268 ZigLLVM_UEFI,
269 ZigLLVM_Win32,
270 ZigLLVM_ZOS,
271 ZigLLVM_Haiku,
272 ZigLLVM_RTEMS,
273 ZigLLVM_NaCl, // Native Client
274 ZigLLVM_AIX,
275 ZigLLVM_CUDA, // NVIDIA CUDA
276 ZigLLVM_NVCL, // NVIDIA OpenCL
277 ZigLLVM_AMDHSA, // AMD HSA Runtime
278 ZigLLVM_PS4,
279 ZigLLVM_PS5,
280 ZigLLVM_ELFIAMCU,
281 ZigLLVM_TvOS, // Apple tvOS
282 ZigLLVM_WatchOS, // Apple watchOS
283 ZigLLVM_BridgeOS, // Apple bridgeOS
284 ZigLLVM_DriverKit, // Apple DriverKit
285 ZigLLVM_XROS, // Apple XROS
286 ZigLLVM_Mesa3D,
287 ZigLLVM_AMDPAL, // AMD PAL Runtime
288 ZigLLVM_HermitCore, // HermitCore Unikernel/Multikernel
289 ZigLLVM_Hurd, // GNU/Hurd
290 ZigLLVM_WASI, // Experimental WebAssembly OS
291 ZigLLVM_Emscripten,
292 ZigLLVM_ShaderModel, // DirectX ShaderModel
293 ZigLLVM_LiteOS,
294 ZigLLVM_Serenity,
295 ZigLLVM_Vulkan, // Vulkan SPIR-V
296 ZigLLVM_LastOSType = ZigLLVM_Vulkan
297};
298
299// Synchronize with target.cpp::abi_list
300enum ZigLLVM_EnvironmentType {
301 ZigLLVM_UnknownEnvironment,
302
303 ZigLLVM_GNU,
304 ZigLLVM_GNUABIN32,
305 ZigLLVM_GNUABI64,
306 ZigLLVM_GNUEABI,
307 ZigLLVM_GNUEABIHF,
308 ZigLLVM_GNUF32,
309 ZigLLVM_GNUF64,
310 ZigLLVM_GNUSF,
311 ZigLLVM_GNUX32,
312 ZigLLVM_GNUILP32,
313 ZigLLVM_CODE16,
314 ZigLLVM_EABI,
315 ZigLLVM_EABIHF,
316 ZigLLVM_Android,
317 ZigLLVM_Musl,
318 ZigLLVM_MuslEABI,
319 ZigLLVM_MuslEABIHF,
320 ZigLLVM_MuslX32,
321
322 ZigLLVM_MSVC,
323 ZigLLVM_Itanium,
324 ZigLLVM_Cygnus,
325 ZigLLVM_CoreCLR,
326 ZigLLVM_Simulator, // Simulator variants of other systems, e.g., Apple's iOS
327 ZigLLVM_MacABI, // Mac Catalyst variant of Apple's iOS deployment target.
328
329 ZigLLVM_Pixel,
330 ZigLLVM_Vertex,
331 ZigLLVM_Geometry,
332 ZigLLVM_Hull,
333 ZigLLVM_Domain,
334 ZigLLVM_Compute,
335 ZigLLVM_Library,
336 ZigLLVM_RayGeneration,
337 ZigLLVM_Intersection,
338 ZigLLVM_AnyHit,
339 ZigLLVM_ClosestHit,
340 ZigLLVM_Miss,
341 ZigLLVM_Callable,
342 ZigLLVM_Mesh,
343 ZigLLVM_Amplification,
344 ZigLLVM_OpenCL,
345 ZigLLVM_OpenHOS,
346
347 ZigLLVM_PAuthTest,
348
349 ZigLLVM_LastEnvironmentType = ZigLLVM_PAuthTest
350};
351
352enum ZigLLVM_ObjectFormatType {
353 ZigLLVM_UnknownObjectFormat,
354
355 ZigLLVM_COFF,
356 ZigLLVM_DXContainer,
357 ZigLLVM_ELF,
358 ZigLLVM_GOFF,
359 ZigLLVM_MachO,
360 ZigLLVM_SPIRV,
361 ZigLLVM_Wasm,
362 ZigLLVM_XCOFF,
363};
364
365#define ZigLLVM_DIFlags_Zero 0U
366#define ZigLLVM_DIFlags_Private 1U
367#define ZigLLVM_DIFlags_Protected 2U
368#define ZigLLVM_DIFlags_Public 3U
369#define ZigLLVM_DIFlags_FwdDecl (1U << 2)
370#define ZigLLVM_DIFlags_AppleBlock (1U << 3)
371#define ZigLLVM_DIFlags_BlockByrefStruct (1U << 4)
372#define ZigLLVM_DIFlags_Virtual (1U << 5)
373#define ZigLLVM_DIFlags_Artificial (1U << 6)
374#define ZigLLVM_DIFlags_Explicit (1U << 7)
375#define ZigLLVM_DIFlags_Prototyped (1U << 8)
376#define ZigLLVM_DIFlags_ObjcClassComplete (1U << 9)
377#define ZigLLVM_DIFlags_ObjectPointer (1U << 10)
378#define ZigLLVM_DIFlags_Vector (1U << 11)
379#define ZigLLVM_DIFlags_StaticMember (1U << 12)
380#define ZigLLVM_DIFlags_LValueReference (1U << 13)
381#define ZigLLVM_DIFlags_RValueReference (1U << 14)
382#define ZigLLVM_DIFlags_Reserved (1U << 15)
383#define ZigLLVM_DIFlags_SingleInheritance (1U << 16)
384#define ZigLLVM_DIFlags_MultipleInheritance (2 << 16)
385#define ZigLLVM_DIFlags_VirtualInheritance (3 << 16)
386#define ZigLLVM_DIFlags_IntroducedVirtual (1U << 18)
387#define ZigLLVM_DIFlags_BitField (1U << 19)
388#define ZigLLVM_DIFlags_NoReturn (1U << 20)
389#define ZigLLVM_DIFlags_TypePassByValue (1U << 22)
390#define ZigLLVM_DIFlags_TypePassByReference (1U << 23)
391#define ZigLLVM_DIFlags_EnumClass (1U << 24)
392#define ZigLLVM_DIFlags_Thunk (1U << 25)
393#define ZigLLVM_DIFlags_NonTrivial (1U << 26)
394#define ZigLLVM_DIFlags_BigEndian (1U << 27)
395#define ZigLLVM_DIFlags_LittleEndian (1U << 28)
396#define ZigLLVM_DIFlags_AllCallsDescribed (1U << 29)
397
398106ZIG_EXTERN_C bool ZigLLDLinkCOFF(int argc, const char **argv, bool can_exit_early, bool disable_output);
399107ZIG_EXTERN_C bool ZigLLDLinkELF(int argc, const char **argv, bool can_exit_early, bool disable_output);
400108ZIG_EXTERN_C bool ZigLLDLinkWasm(int argc, const char **argv, bool can_exit_early, bool disable_output);
401109
402110ZIG_EXTERN_C bool ZigLLVMWriteArchive(const char *archive_name, const char **file_names, size_t file_name_count,
403 enum ZigLLVM_OSType os_type);
111 ZigLLVMArchiveKind archive_kind);
404112
405ZIG_EXTERN_C bool ZigLLVMWriteImportLibrary(const char *def_path, const enum ZigLLVM_ArchType arch,
406 const char *output_lib_path, bool kill_at);
113ZIG_EXTERN_C bool ZigLLVMWriteImportLibrary(const char *def_path, unsigned int coff_machine,
114 const char *output_lib_path, bool kill_at);
407115
408116#endif