1//===- bolt/Core/Linker.h - BOLTLinker interface ----------------*- 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 interface BOLT uses for linking.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef BOLT_CORE_LINKER_H
14#define BOLT_CORE_LINKER_H
15
16#include "llvm/ADT/StringRef.h"
17#include "llvm/Support/MemoryBufferRef.h"
18
19#include <cstdint>
20#include <functional>
21#include <optional>
22
23namespace llvm {
24namespace bolt {
25
26class BinarySection;
27
28class BOLTLinker {
29public:
30 using SectionMapper =
31 std::function<void(const BinarySection &Section, uint64_t Address)>;
32 using SectionsMapper = std::function<void(SectionMapper)>;
33
34 struct SymbolInfo {
35 uint64_t Address;
36 uint64_t Size;
37 };
38
39 virtual ~BOLTLinker() = default;
40
41 /// Load and link \p Obj. \p MapSections will be called before the object is
42 /// linked to allow section addresses to be remapped. When called, the address
43 /// of a section can be changed by calling the passed SectionMapper.
44 virtual void loadObject(MemoryBufferRef Obj, SectionsMapper MapSections) = 0;
45
46 /// Return the address and size of a symbol or std::nullopt if it cannot be
47 /// found.
48 virtual std::optional<SymbolInfo> lookupSymbolInfo(StringRef Name) const = 0;
49
50 /// Return the address of a symbol or std::nullopt if it cannot be found.
51 std::optional<uint64_t> lookupSymbol(StringRef Name) const {
52 if (const auto Info = lookupSymbolInfo(Name))
53 return Info->Address;
54 return std::nullopt;
55 }
56};
57
58} // namespace bolt
59} // namespace llvm
60
61#endif // BOLT_CORE_LINKER_H
62

source code of bolt/include/bolt/Core/Linker.h