106c3fb27SDimitry Andric //===- EmbedBitcodePass.cpp - Pass that embeds the bitcode into a global---===// 206c3fb27SDimitry Andric // 306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric // 706c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric 906c3fb27SDimitry Andric #include "llvm/Transforms/IPO/EmbedBitcodePass.h" 1006c3fb27SDimitry Andric #include "llvm/IR/PassManager.h" 1106c3fb27SDimitry Andric #include "llvm/Pass.h" 1206c3fb27SDimitry Andric #include "llvm/Support/ErrorHandling.h" 1306c3fb27SDimitry Andric #include "llvm/Support/MemoryBufferRef.h" 1406c3fb27SDimitry Andric #include "llvm/Support/raw_ostream.h" 1506c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h" 1606c3fb27SDimitry Andric #include "llvm/Transforms/IPO/ThinLTOBitcodeWriter.h" 1706c3fb27SDimitry Andric #include "llvm/Transforms/Utils/ModuleUtils.h" 1806c3fb27SDimitry Andric 1906c3fb27SDimitry Andric #include <string> 2006c3fb27SDimitry Andric 2106c3fb27SDimitry Andric using namespace llvm; 2206c3fb27SDimitry Andric 2306c3fb27SDimitry Andric PreservedAnalyses EmbedBitcodePass::run(Module &M, ModuleAnalysisManager &AM) { 2406c3fb27SDimitry Andric if (M.getGlobalVariable("llvm.embedded.module", /*AllowInternal=*/true)) 2506c3fb27SDimitry Andric report_fatal_error("Can only embed the module once", 2606c3fb27SDimitry Andric /*gen_crash_diag=*/false); 2706c3fb27SDimitry Andric 2806c3fb27SDimitry Andric Triple T(M.getTargetTriple()); 2906c3fb27SDimitry Andric if (T.getObjectFormat() != Triple::ELF) 3006c3fb27SDimitry Andric report_fatal_error( 3106c3fb27SDimitry Andric "EmbedBitcode pass currently only supports ELF object format", 3206c3fb27SDimitry Andric /*gen_crash_diag=*/false); 3306c3fb27SDimitry Andric std::string Data; 3406c3fb27SDimitry Andric raw_string_ostream OS(Data); 35*5f757f3fSDimitry Andric ThinLTOBitcodeWriterPass(OS, /*ThinLinkOS=*/nullptr).run(M, AM); 3606c3fb27SDimitry Andric embedBufferInModule(M, MemoryBufferRef(Data, "ModuleData"), ".llvm.lto"); 3706c3fb27SDimitry Andric return PreservedAnalyses::all(); 3806c3fb27SDimitry Andric } 39