1//===- bolt/Utils/Utils.cpp - Common helper functions ---------------------===//
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// Common helper functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "bolt/Utils/Utils.h"
14#include "llvm/BinaryFormat/Dwarf.h"
15#include "llvm/MC/MCDwarf.h"
16#include "llvm/Support/LEB128.h"
17#include "llvm/Support/raw_ostream.h"
18
19namespace llvm {
20namespace bolt {
21
22void report_error(StringRef Message, std::error_code EC) {
23 assert(EC);
24 errs() << "BOLT-ERROR: '" << Message << "': " << EC.message() << ".\n";
25 exit(status: 1);
26}
27
28void report_error(StringRef Message, Error E) {
29 assert(E);
30 errs() << "BOLT-ERROR: '" << Message << "': " << toString(E: std::move(E))
31 << ".\n";
32 exit(status: 1);
33}
34
35void check_error(std::error_code EC, StringRef Message) {
36 if (!EC)
37 return;
38 report_error(Message, EC);
39}
40
41void check_error(Error E, Twine Message) {
42 if (!E)
43 return;
44 handleAllErrors(E: std::move(E), Handlers: [&](const llvm::ErrorInfoBase &EIB) {
45 llvm::errs() << "BOLT-ERROR: '" << Message << "': " << EIB.message()
46 << '\n';
47 exit(status: 1);
48 });
49}
50
51std::string getEscapedName(const StringRef &Name) {
52 std::string Output = Name.str();
53 for (size_t I = 0; I < Output.size(); ++I)
54 if (Output[I] == ' ' || Output[I] == '\\')
55 Output.insert(pos: I++, n: 1, c: '\\');
56
57 return Output;
58}
59
60std::string getUnescapedName(const StringRef &Name) {
61 std::string Output = Name.str();
62 for (size_t I = 0; I < Output.size(); ++I)
63 if (Output[I] == '\\')
64 Output.erase(pos: I++, n: 1);
65
66 return Output;
67}
68
69std::optional<StringRef> getLTOCommonName(const StringRef Name) {
70 for (StringRef Suffix : {".__uniq.", ".lto_priv.", ".constprop.", ".llvm."}) {
71 size_t LTOSuffixPos = Name.find(Str: Suffix);
72 if (LTOSuffixPos != StringRef::npos)
73 return Name.substr(Start: 0, N: LTOSuffixPos + Suffix.size());
74 }
75 return std::nullopt;
76}
77
78std::optional<uint8_t> readDWARFExpressionTargetReg(StringRef ExprBytes) {
79 uint8_t Opcode = ExprBytes[0];
80 if (Opcode == dwarf::DW_CFA_def_cfa_expression)
81 return std::nullopt;
82 assert((Opcode == dwarf::DW_CFA_expression ||
83 Opcode == dwarf::DW_CFA_val_expression) &&
84 "invalid DWARF expression CFI");
85 assert(ExprBytes.size() > 1 && "DWARF expression CFI is too short");
86 const uint8_t *const Start =
87 reinterpret_cast<const uint8_t *>(ExprBytes.drop_front(N: 1).data());
88 const uint8_t *const End =
89 reinterpret_cast<const uint8_t *>(Start + ExprBytes.size() - 1);
90 uint8_t Reg = decodeULEB128(p: Start, n: nullptr, end: End);
91 return Reg;
92}
93
94} // namespace bolt
95
96bool operator==(const llvm::MCCFIInstruction &L,
97 const llvm::MCCFIInstruction &R) {
98 if (L.getOperation() != R.getOperation())
99 return false;
100 switch (L.getOperation()) {
101 case MCCFIInstruction::OpRestore:
102 case MCCFIInstruction::OpSameValue:
103 case MCCFIInstruction::OpUndefined:
104 case MCCFIInstruction::OpDefCfaRegister:
105 return L.getRegister() == R.getRegister();
106 case MCCFIInstruction::OpRegister:
107 return L.getRegister() == R.getRegister() &&
108 L.getRegister2() == R.getRegister2();
109 case MCCFIInstruction::OpOffset:
110 case MCCFIInstruction::OpRelOffset:
111 case MCCFIInstruction::OpDefCfa:
112 return L.getRegister() == R.getRegister() && L.getOffset() == R.getOffset();
113 case MCCFIInstruction::OpEscape:
114 return L.getValues() == R.getValues();
115 case MCCFIInstruction::OpRememberState:
116 case MCCFIInstruction::OpRestoreState:
117 return true;
118 case MCCFIInstruction::OpDefCfaOffset:
119 case MCCFIInstruction::OpAdjustCfaOffset:
120 return L.getOffset() == R.getOffset();
121 default:
122 return false;
123 }
124}
125
126} // namespace llvm
127

source code of bolt/lib/Utils/Utils.cpp