1 //===- bolt/RuntimeLibs/HugifyRuntimeLibrary.cpp - Hugify RT Library ------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the HugifyRuntimeLibrary class.
11 //===----------------------------------------------------------------------===//
13 #include "bolt/RuntimeLibs/HugifyRuntimeLibrary.h"
14 #include "bolt/Core/BinaryFunction.h"
15 #include "bolt/Core/Linker.h"
16 #include "llvm/MC/MCStreamer.h"
17 #include "llvm/Support/Alignment.h"
18 #include "llvm/Support/CommandLine.h"
25 extern cl::OptionCategory BoltOptCategory
;
27 extern cl::opt
<bool> HotText
;
31 cl::desc("Automatically put hot code on 2MB page(s) (hugify) at "
32 "runtime. No manual call to hugify is needed in the binary "
33 "(which is what --hot-text relies on)."),
34 cl::cat(BoltOptCategory
));
36 static cl::opt
<std::string
> RuntimeHugifyLib(
38 cl::desc("specify file name of the runtime hugify library"),
39 cl::init("libbolt_rt_hugify.a"), cl::cat(BoltOptCategory
));
43 void HugifyRuntimeLibrary::adjustCommandLineOptions(
44 const BinaryContext
&BC
) const {
47 << "BOLT-ERROR: -hot-text should be applied to binaries with "
48 "pre-compiled manual hugify support, while -hugify will add hugify "
49 "support automatically. These two options cannot both be present.\n";
52 // After the check, we set HotText to be true because automated hugify support
55 if (!BC
.StartFunctionAddress
) {
56 errs() << "BOLT-ERROR: hugify runtime libraries require a known entry "
63 void HugifyRuntimeLibrary::link(BinaryContext
&BC
, StringRef ToolPath
,
65 BOLTLinker::SectionsMapper MapSections
) {
67 std::string LibPath
= getLibPath(ToolPath
, opts::RuntimeHugifyLib
);
68 loadLibrary(LibPath
, Linker
, MapSections
);
70 assert(!RuntimeStartAddress
&&
71 "We don't currently support linking multiple runtime libraries");
72 RuntimeStartAddress
= Linker
.lookupSymbol("__bolt_hugify_self").value_or(0);
73 if (!RuntimeStartAddress
) {
74 errs() << "BOLT-ERROR: instrumentation library does not define "
75 "__bolt_hugify_self: "