blob: 337526155678695d07c0fe14ecace776bf03974b [file] [log] [blame]
// 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