1*6dbdd20aSAndroid Build Coastguard Worker /* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker * 4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker * 8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker * 10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker */ 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_PROFILING_SYMBOLIZER_LOCAL_SYMBOLIZER_H_ 18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_PROFILING_SYMBOLIZER_LOCAL_SYMBOLIZER_H_ 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker #include <functional> 21*6dbdd20aSAndroid Build Coastguard Worker #include <map> 22*6dbdd20aSAndroid Build Coastguard Worker #include <memory> 23*6dbdd20aSAndroid Build Coastguard Worker #include <optional> 24*6dbdd20aSAndroid Build Coastguard Worker #include <string> 25*6dbdd20aSAndroid Build Coastguard Worker #include <vector> 26*6dbdd20aSAndroid Build Coastguard Worker 27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/scoped_file.h" 28*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/symbolizer/subprocess.h" 29*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/symbolizer/symbolizer.h" 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 32*6dbdd20aSAndroid Build Coastguard Worker namespace profiling { 33*6dbdd20aSAndroid Build Coastguard Worker 34*6dbdd20aSAndroid Build Coastguard Worker bool ParseLlvmSymbolizerJsonLine(const std::string& line, 35*6dbdd20aSAndroid Build Coastguard Worker std::vector<SymbolizedFrame>* result); 36*6dbdd20aSAndroid Build Coastguard Worker enum BinaryType { 37*6dbdd20aSAndroid Build Coastguard Worker kElf, 38*6dbdd20aSAndroid Build Coastguard Worker kMachO, 39*6dbdd20aSAndroid Build Coastguard Worker kMachODsym, 40*6dbdd20aSAndroid Build Coastguard Worker }; 41*6dbdd20aSAndroid Build Coastguard Worker 42*6dbdd20aSAndroid Build Coastguard Worker struct FoundBinary { 43*6dbdd20aSAndroid Build Coastguard Worker std::string file_name; 44*6dbdd20aSAndroid Build Coastguard Worker uint64_t load_bias; 45*6dbdd20aSAndroid Build Coastguard Worker BinaryType type; 46*6dbdd20aSAndroid Build Coastguard Worker }; 47*6dbdd20aSAndroid Build Coastguard Worker 48*6dbdd20aSAndroid Build Coastguard Worker class BinaryFinder { 49*6dbdd20aSAndroid Build Coastguard Worker public: 50*6dbdd20aSAndroid Build Coastguard Worker virtual ~BinaryFinder(); 51*6dbdd20aSAndroid Build Coastguard Worker virtual std::optional<FoundBinary> FindBinary( 52*6dbdd20aSAndroid Build Coastguard Worker const std::string& abspath, 53*6dbdd20aSAndroid Build Coastguard Worker const std::string& build_id) = 0; 54*6dbdd20aSAndroid Build Coastguard Worker }; 55*6dbdd20aSAndroid Build Coastguard Worker 56*6dbdd20aSAndroid Build Coastguard Worker class LocalBinaryIndexer : public BinaryFinder { 57*6dbdd20aSAndroid Build Coastguard Worker public: 58*6dbdd20aSAndroid Build Coastguard Worker explicit LocalBinaryIndexer(std::vector<std::string> roots); 59*6dbdd20aSAndroid Build Coastguard Worker 60*6dbdd20aSAndroid Build Coastguard Worker std::optional<FoundBinary> FindBinary(const std::string& abspath, 61*6dbdd20aSAndroid Build Coastguard Worker const std::string& build_id) override; 62*6dbdd20aSAndroid Build Coastguard Worker ~LocalBinaryIndexer() override; 63*6dbdd20aSAndroid Build Coastguard Worker 64*6dbdd20aSAndroid Build Coastguard Worker private: 65*6dbdd20aSAndroid Build Coastguard Worker std::map<std::string, FoundBinary> buildid_to_file_; 66*6dbdd20aSAndroid Build Coastguard Worker }; 67*6dbdd20aSAndroid Build Coastguard Worker 68*6dbdd20aSAndroid Build Coastguard Worker class LocalBinaryFinder : public BinaryFinder { 69*6dbdd20aSAndroid Build Coastguard Worker public: 70*6dbdd20aSAndroid Build Coastguard Worker explicit LocalBinaryFinder(std::vector<std::string> roots); 71*6dbdd20aSAndroid Build Coastguard Worker 72*6dbdd20aSAndroid Build Coastguard Worker std::optional<FoundBinary> FindBinary(const std::string& abspath, 73*6dbdd20aSAndroid Build Coastguard Worker const std::string& build_id) override; 74*6dbdd20aSAndroid Build Coastguard Worker 75*6dbdd20aSAndroid Build Coastguard Worker ~LocalBinaryFinder() override; 76*6dbdd20aSAndroid Build Coastguard Worker 77*6dbdd20aSAndroid Build Coastguard Worker private: 78*6dbdd20aSAndroid Build Coastguard Worker std::optional<FoundBinary> IsCorrectFile(const std::string& symbol_file, 79*6dbdd20aSAndroid Build Coastguard Worker const std::string& build_id); 80*6dbdd20aSAndroid Build Coastguard Worker 81*6dbdd20aSAndroid Build Coastguard Worker std::optional<FoundBinary> FindBinaryInRoot(const std::string& root_str, 82*6dbdd20aSAndroid Build Coastguard Worker const std::string& abspath, 83*6dbdd20aSAndroid Build Coastguard Worker const std::string& build_id); 84*6dbdd20aSAndroid Build Coastguard Worker 85*6dbdd20aSAndroid Build Coastguard Worker private: 86*6dbdd20aSAndroid Build Coastguard Worker std::vector<std::string> roots_; 87*6dbdd20aSAndroid Build Coastguard Worker std::map<std::string, std::optional<FoundBinary>> cache_; 88*6dbdd20aSAndroid Build Coastguard Worker }; 89*6dbdd20aSAndroid Build Coastguard Worker 90*6dbdd20aSAndroid Build Coastguard Worker class LLVMSymbolizerProcess { 91*6dbdd20aSAndroid Build Coastguard Worker public: 92*6dbdd20aSAndroid Build Coastguard Worker explicit LLVMSymbolizerProcess(const std::string& symbolizer_path); 93*6dbdd20aSAndroid Build Coastguard Worker 94*6dbdd20aSAndroid Build Coastguard Worker std::vector<SymbolizedFrame> Symbolize(const std::string& binary, 95*6dbdd20aSAndroid Build Coastguard Worker uint64_t address); 96*6dbdd20aSAndroid Build Coastguard Worker 97*6dbdd20aSAndroid Build Coastguard Worker private: 98*6dbdd20aSAndroid Build Coastguard Worker Subprocess subprocess_; 99*6dbdd20aSAndroid Build Coastguard Worker }; 100*6dbdd20aSAndroid Build Coastguard Worker 101*6dbdd20aSAndroid Build Coastguard Worker class LocalSymbolizer : public Symbolizer { 102*6dbdd20aSAndroid Build Coastguard Worker public: 103*6dbdd20aSAndroid Build Coastguard Worker LocalSymbolizer(const std::string& symbolizer_path, 104*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<BinaryFinder> finder); 105*6dbdd20aSAndroid Build Coastguard Worker 106*6dbdd20aSAndroid Build Coastguard Worker explicit LocalSymbolizer(std::unique_ptr<BinaryFinder> finder); 107*6dbdd20aSAndroid Build Coastguard Worker 108*6dbdd20aSAndroid Build Coastguard Worker std::vector<std::vector<SymbolizedFrame>> Symbolize( 109*6dbdd20aSAndroid Build Coastguard Worker const std::string& mapping_name, 110*6dbdd20aSAndroid Build Coastguard Worker const std::string& build_id, 111*6dbdd20aSAndroid Build Coastguard Worker uint64_t load_bias, 112*6dbdd20aSAndroid Build Coastguard Worker const std::vector<uint64_t>& address) override; 113*6dbdd20aSAndroid Build Coastguard Worker 114*6dbdd20aSAndroid Build Coastguard Worker ~LocalSymbolizer() override; 115*6dbdd20aSAndroid Build Coastguard Worker 116*6dbdd20aSAndroid Build Coastguard Worker private: 117*6dbdd20aSAndroid Build Coastguard Worker LLVMSymbolizerProcess llvm_symbolizer_; 118*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<BinaryFinder> finder_; 119*6dbdd20aSAndroid Build Coastguard Worker }; 120*6dbdd20aSAndroid Build Coastguard Worker 121*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<Symbolizer> LocalSymbolizerOrDie( 122*6dbdd20aSAndroid Build Coastguard Worker std::vector<std::string> binary_path, 123*6dbdd20aSAndroid Build Coastguard Worker const char* mode); 124*6dbdd20aSAndroid Build Coastguard Worker 125*6dbdd20aSAndroid Build Coastguard Worker } // namespace profiling 126*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 127*6dbdd20aSAndroid Build Coastguard Worker 128*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_PROFILING_SYMBOLIZER_LOCAL_SYMBOLIZER_H_ 129