| // Copyright 2021 The IREE Authors |
| // |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| #include "compiler/plugins/target/LLVMCPU/Builtins/Musl.h" |
| |
| #include "iree/builtins/musl/bin/libmusl.h" |
| #include "llvm/Bitcode/BitcodeReader.h" |
| #include "llvm/Support/MemoryBufferRef.h" |
| #include "mlir/Support/LLVM.h" |
| |
| namespace mlir::iree_compiler::IREE::HAL { |
| |
| static const iree_file_toc_t *lookupMuslFile(StringRef filename) { |
| for (size_t i = 0; i < iree_builtins_libmusl_size(); ++i) { |
| const auto &file_toc = iree_builtins_libmusl_create()[i]; |
| if (filename == file_toc.name) |
| return &file_toc; |
| } |
| return nullptr; |
| } |
| |
| static const iree_file_toc_t * |
| lookupMuslFile(llvm::TargetMachine *targetMachine) { |
| const auto &triple = targetMachine->getTargetTriple(); |
| |
| // NOTE: other arch-specific checks go here. |
| |
| // Fallback path using the generic wasm variants as they are largely |
| // machine-agnostic. |
| if (triple.isArch32Bit()) { |
| return lookupMuslFile("libmusl_wasm32_generic.bc"); |
| } else if (triple.isArch64Bit()) { |
| return lookupMuslFile("libmusl_wasm64_generic.bc"); |
| } else { |
| return nullptr; |
| } |
| } |
| |
| llvm::Expected<std::unique_ptr<llvm::Module>> |
| loadMuslBitcode(llvm::TargetMachine *targetMachine, |
| llvm::LLVMContext &context) { |
| // Find a bitcode file for the current architecture. |
| const auto *file = lookupMuslFile(targetMachine); |
| if (!file) { |
| return llvm::createStringError(llvm::inconvertibleErrorCode(), |
| "no matching architecture bitcode file"); |
| } |
| |
| // Load the generic bitcode file contents. |
| llvm::MemoryBufferRef bitcodeBufferRef( |
| llvm::StringRef(file->data, file->size), file->name); |
| return llvm::parseBitcodeFile(bitcodeBufferRef, context); |
| } |
| |
| } // namespace mlir::iree_compiler::IREE::HAL |