================ @@ -0,0 +1,367 @@ +//===- bolt/Rewrite/JITRewriteInstance.cpp - JIT rewriter -------------===// +// +// Part of the LLVM Project, 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 "bolt/Rewrite/JITRewriteInstance.h" +#include "bolt/Core/BinaryContext.h" +#include "bolt/Core/BinaryEmitter.h" +#include "bolt/Core/BinaryFunction.h" +#include "bolt/Core/JumpTable.h" +#include "bolt/Core/MCPlusBuilder.h" +#include "bolt/Profile/DataAggregator.h" +#include "bolt/Rewrite/BinaryPassManager.h" +#include "bolt/Rewrite/RewriteInstance.h" +#include "bolt/Utils/Utils.h" +#include "llvm/MC/MCAsmLayout.h" +#include "llvm/MC/MCObjectStreamer.h" +#include "llvm/Object/SymbolSize.h" +#include "llvm/Support/Errc.h" +#include "llvm/Support/FileSystem.h" +#include <memory> + +namespace opts { + +using namespace llvm; +extern cl::opt<unsigned> AlignText; +extern cl::opt<bool> PrintSections; +extern cl::opt<bool> PrintDisasm; +extern cl::opt<bool> PrintCFG; +extern cl::opt<unsigned> Verbosity; +} // namespace opts + +namespace llvm { +namespace bolt { + +#define DEBUG_TYPE "bolt" + +Expected<std::unique_ptr<JITRewriteInstance>> +JITRewriteInstance::createJITRewriteInstance(JournalingStreams Logger, + bool IsPIC) { + Error Err = Error::success(); + std::unique_ptr<JITRewriteInstance> JITRI( + new JITRewriteInstance(Logger, IsPIC, Err)); + if (Err) + return std::move(Err); + return std::move(JITRI); +} + +JITRewriteInstance::JITRewriteInstance(JournalingStreams Logger, bool IsPIC, + Error &Err) + : StrPool(StrAllocator) { + ErrorAsOutParameter EAO(&Err); + Triple TheTriple(sys::getDefaultTargetTriple().c_str()); + + auto BCOrErr = BinaryContext::createBinaryContext( + TheTriple, StringRef("JIT input file"), nullptr, IsPIC, nullptr, Logger); + if (Error E = BCOrErr.takeError()) { + Err = std::move(E); + return; + } + BC = std::move(BCOrErr.get()); + BC->initializeTarget(std::unique_ptr<MCPlusBuilder>( + createMCPlusBuilder(BC->TheTriple->getArch(), BC->MIA.get(), + BC->MII.get(), BC->MRI.get(), BC->STI.get()))); + BC->FirstAllocAddress = 0; + BC->LayoutStartAddress = 0xffffffffffffffff; +} + +JITRewriteInstance::~JITRewriteInstance() {} + +void JITRewriteInstance::adjustCommandLineOptions() { + if (!opts::AlignText.getNumOccurrences()) + opts::AlignText = BC->PageAlign; +} + +Error JITRewriteInstance::preprocessProfileData() { + if (!ProfileReader) + return Error::success(); + if (Error E = ProfileReader->preprocessProfile(*BC.get())) + return Error(std::move(E)); + return Error::success(); +} + +Error JITRewriteInstance::processProfileDataPreCFG() { + if (!ProfileReader) + return Error::success(); + if (Error E = ProfileReader->readProfilePreCFG(*BC.get())) + return Error(std::move(E)); + return Error::success(); +} + +Error JITRewriteInstance::processProfileData() { + if (!ProfileReader) + return Error::success(); + if (Error E = ProfileReader->readProfile(*BC.get())) + return Error(std::move(E)); + return Error::success(); +} + +Error JITRewriteInstance::disassembleFunctions() { ---------------- aaupov wrote:
I believe that this and other functions are common across *RewriteInstance classes. Is it worth defining a BaseRewriteInstance class and providing them there? https://github.com/llvm/llvm-project/pull/81346 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits