1 | //===- bolt/RuntimeLibs/HugifyRuntimeLibrary.cpp - Hugify RT Library ------===// |
2 | // |
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 |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file implements the HugifyRuntimeLibrary class. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #include "bolt/RuntimeLibs/HugifyRuntimeLibrary.h" |
14 | #include "bolt/Core/BinaryContext.h" |
15 | #include "bolt/Core/Linker.h" |
16 | #include "llvm/MC/MCStreamer.h" |
17 | #include "llvm/Support/CommandLine.h" |
18 | |
19 | using namespace llvm; |
20 | using namespace bolt; |
21 | |
22 | namespace opts { |
23 | |
24 | extern cl::OptionCategory BoltOptCategory; |
25 | |
26 | extern cl::opt<bool> HotText; |
27 | |
28 | cl::opt<bool> |
29 | Hugify("hugify" , |
30 | cl::desc("Automatically put hot code on 2MB page(s) (hugify) at " |
31 | "runtime. No manual call to hugify is needed in the binary " |
32 | "(which is what --hot-text relies on)." ), |
33 | cl::cat(BoltOptCategory)); |
34 | |
35 | static cl::opt<std::string> RuntimeHugifyLib( |
36 | "runtime-hugify-lib" , |
37 | cl::desc("specify file name of the runtime hugify library" ), |
38 | cl::init(Val: "libbolt_rt_hugify.a" ), cl::cat(BoltOptCategory)); |
39 | |
40 | } // namespace opts |
41 | |
42 | void HugifyRuntimeLibrary::adjustCommandLineOptions( |
43 | const BinaryContext &BC) const { |
44 | if (opts::HotText) { |
45 | errs() |
46 | << "BOLT-ERROR: -hot-text should be applied to binaries with " |
47 | "pre-compiled manual hugify support, while -hugify will add hugify " |
48 | "support automatically. These two options cannot both be present.\n" ; |
49 | exit(status: 1); |
50 | } |
51 | // After the check, we set HotText to be true because automated hugify support |
52 | // relies on it. |
53 | opts::HotText = true; |
54 | if (!BC.StartFunctionAddress) { |
55 | errs() << "BOLT-ERROR: hugify runtime libraries require a known entry " |
56 | "point of " |
57 | "the input binary\n" ; |
58 | exit(status: 1); |
59 | } |
60 | } |
61 | |
62 | void HugifyRuntimeLibrary::link(BinaryContext &BC, StringRef ToolPath, |
63 | BOLTLinker &Linker, |
64 | BOLTLinker::SectionsMapper MapSections) { |
65 | |
66 | std::string LibPath = getLibPath(ToolPath, LibFileName: opts::RuntimeHugifyLib); |
67 | loadLibrary(LibPath, Linker, MapSections); |
68 | |
69 | assert(!RuntimeStartAddress && |
70 | "We don't currently support linking multiple runtime libraries" ); |
71 | RuntimeStartAddress = Linker.lookupSymbol(Name: "__bolt_hugify_self" ).value_or(u: 0); |
72 | if (!RuntimeStartAddress) { |
73 | errs() << "BOLT-ERROR: hugify library does not define __bolt_hugify_self: " |
74 | << LibPath << "\n" ; |
75 | exit(status: 1); |
76 | } |
77 | } |
78 | |