1 //===- bolt/RuntimeLibs/RuntimeLibrary.h - Runtime Library ------*- C++ -*-===// 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 contains the declaration of the RuntimeLibrary class, which 10 // provides all the necessary utilities to link runtime libraries during binary 11 // rewriting, such as the instrumentation runtime library. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef BOLT_RUNTIMELIBS_RUNTIME_LIBRARY_H 16 #define BOLT_RUNTIMELIBS_RUNTIME_LIBRARY_H 17 18 #include "bolt/Core/Linker.h" 19 #include "llvm/ADT/StringRef.h" 20 #include <vector> 21 22 namespace llvm { 23 24 class MCStreamer; 25 26 namespace bolt { 27 28 class BinaryContext; 29 30 class RuntimeLibrary { 31 // vtable anchor. 32 virtual void anchor(); 33 34 public: 35 virtual ~RuntimeLibrary() = default; 36 37 uint64_t getRuntimeFiniAddress() const { return RuntimeFiniAddress; } 38 39 uint64_t getRuntimeStartAddress() const { return RuntimeStartAddress; } 40 41 /// Add custom sections added by the runtime libraries. 42 virtual void 43 addRuntimeLibSections(std::vector<std::string> &SecNames) const = 0; 44 45 /// Validity check and modify if necessary all the command line options 46 /// for this runtime library. 47 virtual void adjustCommandLineOptions(const BinaryContext &BC) const = 0; 48 49 /// Emit data structures that will be necessary during runtime. 50 virtual void emitBinary(BinaryContext &BC, MCStreamer &Streamer) = 0; 51 52 /// Link with the library code. 53 virtual void link(BinaryContext &BC, StringRef ToolPath, BOLTLinker &Linker, 54 BOLTLinker::SectionsMapper MapSections) = 0; 55 56 protected: 57 /// The fini and init address set by the runtime library. 58 uint64_t RuntimeFiniAddress{0}; 59 uint64_t RuntimeStartAddress{0}; 60 61 /// Get the full path to a runtime library specified by \p LibFileName and \p 62 /// ToolPath. 63 static std::string getLibPathByToolPath(StringRef ToolPath, 64 StringRef LibFileName); 65 66 /// Get the full path to a runtime library by the install directory. 67 static std::string getLibPathByInstalled(StringRef LibFileName); 68 69 /// Gets the full path to a runtime library based on whether it exists 70 /// in the install libdir or runtime libdir. 71 static std::string getLibPath(StringRef ToolPath, StringRef LibFileName); 72 73 /// Load a static runtime library specified by \p LibPath. 74 static void loadLibrary(StringRef LibPath, BOLTLinker &Linker, 75 BOLTLinker::SectionsMapper MapSections); 76 }; 77 78 } // namespace bolt 79 } // namespace llvm 80 81 #endif // BOLT_RUNTIMELIBS_RUNTIME_LIBRARY_H 82