diff --git a/.gitignore b/.gitignore index c7e49e6..1c2b629 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ zig-cache/ zig-out/ nat/ -llvm*/ diff --git a/build.zig b/build.zig index c629991..5463014 100644 --- a/build.zig +++ b/build.zig @@ -102,10 +102,11 @@ pub fn build(b: *std.Build) !void { const llvm_lib_dir = try std.mem.concat(b.allocator, u8, &.{ llvm_path, "/lib" }); compiler.addIncludePath(std.Build.LazyPath.relative(llvm_include_dir)); const cpp_files = .{ - "bootstrap/backend/llvm.cpp", - "bootstrap/frontend/clang/main.cpp", - "bootstrap/frontend/clang/cc1.cpp", - "bootstrap/frontend/clang/cc1as.cpp", + "src/llvm/llvm.cpp", + "src/llvm/lld.cpp", + "src/llvm/clang_main.cpp", + "src/llvm/clang_cc1.cpp", + "src/llvm/clang_cc1as.cpp", }; compiler.addCSourceFiles(.{ .files = &cpp_files, diff --git a/bootstrap/frontend/clang/cc1.cpp b/src/llvm/clang_cc1.cpp similarity index 100% rename from bootstrap/frontend/clang/cc1.cpp rename to src/llvm/clang_cc1.cpp diff --git a/bootstrap/frontend/clang/cc1as.cpp b/src/llvm/clang_cc1as.cpp similarity index 100% rename from bootstrap/frontend/clang/cc1as.cpp rename to src/llvm/clang_cc1as.cpp diff --git a/bootstrap/frontend/clang/main.cpp b/src/llvm/clang_main.cpp similarity index 100% rename from bootstrap/frontend/clang/main.cpp rename to src/llvm/clang_main.cpp diff --git a/src/llvm/lld.cpp b/src/llvm/lld.cpp new file mode 100644 index 0000000..4b38073 --- /dev/null +++ b/src/llvm/lld.cpp @@ -0,0 +1,58 @@ +#include "lld/Common/CommonLinkerContext.h" +using namespace llvm; + +enum class Format { + elf = 0, + macho = 1, + coff = 2, +}; + +namespace lld { + namespace coff { + bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, + llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); + } + namespace elf { + bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, + llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); + } + namespace wasm { + bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, + llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); + } + namespace macho { + bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, + llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); + } +} + +extern "C" void stream_to_string(raw_string_ostream& stream, const char** message_ptr, size_t* message_len); + +extern "C" bool NativityLLDLink(Format format, const char** argument_ptr, size_t argument_count, const char** stdout_ptr, size_t* stdout_len, const char** stderr_ptr, size_t* stderr_len) +{ + auto arguments = ArrayRef(argument_ptr, argument_count); + std::string stdout_string; + raw_string_ostream stdout_stream(stdout_string); + + std::string stderr_string; + raw_string_ostream stderr_stream(stderr_string); + + bool success = false; + switch (format) { + case Format::elf: + success = lld::elf::link(arguments, stdout_stream, stderr_stream, true, false); + break; + case Format::coff: + success = lld::coff::link(arguments, stdout_stream, stderr_stream, true, false); + case Format::macho: + success = lld::macho::link(arguments, stdout_stream, stderr_stream, true, false); + default: + break; + } + + stream_to_string(stdout_stream, stdout_ptr, stdout_len); + stream_to_string(stderr_stream, stderr_ptr, stderr_len); + + return success; +} + diff --git a/bootstrap/backend/llvm.cpp b/src/llvm/llvm.cpp similarity index 94% rename from bootstrap/backend/llvm.cpp rename to src/llvm/llvm.cpp index c88cc99..685e2c7 100644 --- a/bootstrap/backend/llvm.cpp +++ b/src/llvm/llvm.cpp @@ -14,7 +14,6 @@ #include "llvm/Support/TargetSelect.h" #include "llvm/Support/FileSystem.h" -#include "lld/Common/CommonLinkerContext.h" using namespace llvm; @@ -667,7 +666,7 @@ extern "C" Constant* NativityLLVMBuilderCreateGlobalStringPointer(IRBuilder<>& b return constant; } -void stream_to_string(raw_string_ostream& stream, const char** message_ptr, size_t* message_len) +extern "C" void stream_to_string(raw_string_ostream& stream, const char** message_ptr, size_t* message_len) { stream.flush(); @@ -850,25 +849,6 @@ extern "C" void NativityLLVMCallSetCallingConvention(CallBase& call_instruction, call_instruction.setCallingConv(calling_convention); } -namespace lld { - namespace coff { - bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, - llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); - } - namespace elf { - bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, - llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); - } - namespace wasm { - bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, - llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); - } - namespace macho { - bool link(llvm::ArrayRef args, llvm::raw_ostream &stdoutOS, - llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput); - } -} - extern "C" void NativityLLVMInitializeCodeGeneration() { InitializeAllTargetInfos(); @@ -942,40 +922,6 @@ extern "C" bool NativityLLVMModuleAddPassesToEmitFile(Module& module, TargetMach return true; } -enum class Format { - elf = 0, - macho = 1, - coff = 2, -}; - -extern "C" bool NativityLLDLink(Format format, const char** argument_ptr, size_t argument_count, const char** stdout_ptr, size_t* stdout_len, const char** stderr_ptr, size_t* stderr_len) -{ - auto arguments = ArrayRef(argument_ptr, argument_count); - std::string stdout_string; - raw_string_ostream stdout_stream(stdout_string); - - std::string stderr_string; - raw_string_ostream stderr_stream(stderr_string); - - bool success = false; - switch (format) { - case Format::elf: - success = lld::elf::link(arguments, stdout_stream, stderr_stream, true, false); - break; - case Format::coff: - success = lld::coff::link(arguments, stdout_stream, stderr_stream, true, false); - case Format::macho: - success = lld::macho::link(arguments, stdout_stream, stderr_stream, true, false); - default: - break; - } - - stream_to_string(stdout_stream, stdout_ptr, stdout_len); - stream_to_string(stderr_stream, stderr_ptr, stderr_len); - - return success; -} - extern "C" bool NativityLLVMCompareTypes(Type* a, Type* b) { if (auto* int_a = dyn_cast(a)) {