1010#include " llvm/ADT/CachedHashString.h"
1111#include " llvm/DebugInfo/GSYM/FileWriter.h"
1212#include " llvm/DebugInfo/GSYM/FunctionInfo.h"
13+ #include " llvm/DebugInfo/GSYM/GsymCreator.h"
1314#include " llvm/MC/StringTableBuilder.h"
1415#include " llvm/Support/DataExtractor.h"
1516#include " llvm/Support/YAMLParser.h"
2324using namespace llvm ;
2425using namespace gsym ;
2526
26- llvm:: Error CallSiteInfo::encode (FileWriter &O) const {
27+ Error CallSiteInfo::encode (FileWriter &O) const {
2728 O.writeU64 (ReturnAddress);
2829 O.writeU8 (Flags);
2930 O.writeU32 (MatchRegex.size ());
3031 for (uint32_t Entry : MatchRegex)
3132 O.writeU32 (Entry);
32- return llvm:: Error::success ();
33+ return Error::success ();
3334}
3435
35- llvm:: Expected<CallSiteInfo>
36- CallSiteInfo::decode (DataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr ) {
36+ Expected<CallSiteInfo> CallSiteInfo::decode (DataExtractor &Data,
37+ uint64_t &Offset ) {
3738 CallSiteInfo CSI;
3839
3940 // Read ReturnAddress
@@ -68,17 +69,17 @@ CallSiteInfo::decode(DataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr) {
6869 return CSI;
6970}
7071
71- llvm:: Error CallSiteInfoCollection::encode (FileWriter &O) const {
72+ Error CallSiteInfoCollection::encode (FileWriter &O) const {
7273 O.writeU32 (CallSites.size ());
7374 for (const CallSiteInfo &CSI : CallSites) {
74- if (llvm:: Error Err = CSI.encode (O))
75+ if (Error Err = CSI.encode (O))
7576 return Err;
7677 }
77- return llvm:: Error::success ();
78+ return Error::success ();
7879}
7980
80- llvm:: Expected<CallSiteInfoCollection>
81- CallSiteInfoCollection::decode (DataExtractor &Data, uint64_t BaseAddr ) {
81+ Expected<CallSiteInfoCollection>
82+ CallSiteInfoCollection::decode (DataExtractor &Data) {
8283 CallSiteInfoCollection CSC;
8384 uint64_t Offset = 0 ;
8485
@@ -91,8 +92,7 @@ CallSiteInfoCollection::decode(DataExtractor &Data, uint64_t BaseAddr) {
9192
9293 CSC.CallSites .reserve (NumCallSites);
9394 for (uint32_t i = 0 ; i < NumCallSites; ++i) {
94- llvm::Expected<CallSiteInfo> ECSI =
95- CallSiteInfo::decode (Data, Offset, BaseAddr);
95+ Expected<CallSiteInfo> ECSI = CallSiteInfo::decode (Data, Offset);
9696 if (!ECSI)
9797 return ECSI.takeError ();
9898 CSC.CallSites .emplace_back (*ECSI);
@@ -108,7 +108,7 @@ namespace yaml {
108108struct CallSiteYAML {
109109 // The offset of the return address of the call site - relative to the start
110110 // of the function.
111- llvm::yaml:: Hex64 return_offset;
111+ Hex64 return_offset;
112112 std::vector<std::string> match_regex;
113113 std::vector<std::string> flags;
114114};
@@ -149,34 +149,22 @@ template <> struct MappingTraits<FunctionsYAML> {
149149LLVM_YAML_IS_SEQUENCE_VECTOR (CallSiteYAML)
150150LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionYAML)
151151
152- // Implementation of CallSiteInfoLoader
153- StringRef CallSiteInfoLoader::stringFromOffset(uint32_t offset) const {
154- assert (StringOffsetMap.count (offset) &&
155- " expected function name offset to already be in StringOffsetMap" );
156- return StringOffsetMap.find (offset)->second .val ();
157- }
158-
159- uint32_t CallSiteInfoLoader::offsetFromString (StringRef str) {
160- return StrTab.add (StringStorage.insert (str).first ->getKey ());
161- }
162-
163- llvm::Error CallSiteInfoLoader::loadYAML (std::vector<FunctionInfo> &Funcs,
164- StringRef YAMLFile) {
152+ Error CallSiteInfoLoader::loadYAML(std::vector<FunctionInfo> &Funcs,
153+ StringRef YAMLFile) {
165154 // Step 1: Read YAML file
166- auto BufferOrError = llvm:: MemoryBuffer::getFile (YAMLFile);
155+ auto BufferOrError = MemoryBuffer::getFile (YAMLFile);
167156 if (!BufferOrError)
168157 return errorCodeToError (BufferOrError.getError ());
169158
170- std::unique_ptr<llvm:: MemoryBuffer> Buffer = std::move (*BufferOrError);
159+ std::unique_ptr<MemoryBuffer> Buffer = std::move (*BufferOrError);
171160
172161 // Step 2: Parse YAML content
173- llvm:: yaml::FunctionsYAML functionsYAML;
174- llvm:: yaml::Input yin (Buffer->getMemBufferRef ());
162+ yaml::FunctionsYAML functionsYAML;
163+ yaml::Input yin (Buffer->getMemBufferRef ());
175164 yin >> functionsYAML;
176- if (yin.error ()) {
177- return llvm::createStringError (yin.error (), " Error parsing YAML file: %s\n " ,
178- Buffer->getBufferIdentifier ().str ().c_str ());
179- }
165+ if (yin.error ())
166+ return createStringError (yin.error (), " Error parsing YAML file: %s\n " ,
167+ Buffer->getBufferIdentifier ().str ().c_str ());
180168
181169 // Step 3: Build function map from Funcs
182170 auto FuncMap = buildFunctionMap (Funcs);
@@ -189,7 +177,7 @@ StringMap<FunctionInfo *>
189177CallSiteInfoLoader::buildFunctionMap (std::vector<FunctionInfo> &Funcs) {
190178 StringMap<FunctionInfo *> FuncMap;
191179 auto insertFunc = [&](auto &Function) {
192- std::string FuncName = stringFromOffset (Function.Name ). str ( );
180+ StringRef FuncName = GCreator. getString (Function.Name );
193181 // If the function name is already in the map, don't update it. This way we
194182 // preferentially use the first encountered function. Since symbols are
195183 // loaded from dSYM first, we end up preferring keeping track of symbols
@@ -208,19 +196,19 @@ CallSiteInfoLoader::buildFunctionMap(std::vector<FunctionInfo> &Funcs) {
208196 return FuncMap;
209197}
210198
211- llvm:: Error CallSiteInfoLoader::processYAMLFunctions (
212- const llvm:: yaml::FunctionsYAML &functionsYAML,
199+ Error CallSiteInfoLoader::processYAMLFunctions (
200+ const yaml::FunctionsYAML &functionsYAML,
213201 StringMap<FunctionInfo *> &FuncMap) {
214202 // For each function in the YAML file
215203 for (const auto &FuncYAML : functionsYAML.functions ) {
216- auto it = FuncMap.find (FuncYAML.name );
217- if (it == FuncMap.end ()) {
218- return llvm:: createStringError (
204+ auto It = FuncMap.find (FuncYAML.name );
205+ if (It == FuncMap.end ())
206+ return createStringError (
219207 std::errc::invalid_argument,
220208 " Can't find function '%s' specified in callsite YAML\n " ,
221209 FuncYAML.name .c_str ());
222- }
223- FunctionInfo *FuncInfo = it ->second ;
210+
211+ FunctionInfo *FuncInfo = It ->second ;
224212 // Create a CallSiteInfoCollection if not already present
225213 if (!FuncInfo->CallSites )
226214 FuncInfo->CallSites = CallSiteInfoCollection ();
@@ -229,30 +217,30 @@ llvm::Error CallSiteInfoLoader::processYAMLFunctions(
229217 // Since YAML has specifies relative return offsets, add the function
230218 // start address to make the offset absolute.
231219 CSI.ReturnAddress = FuncInfo->Range .start () + CallSiteYAML.return_offset ;
232- for (const auto &Regex : CallSiteYAML.match_regex )
233- CSI.MatchRegex .push_back (offsetFromString (Regex));
220+ for (const auto &Regex : CallSiteYAML.match_regex ) {
221+ uint32_t StrOffset = GCreator.insertString (Regex);
222+ CSI.MatchRegex .push_back (StrOffset);
223+ }
234224
235- // Initialize flags to None
236- CSI.Flags = CallSiteInfo::None;
237225 // Parse flags and combine them
238226 for (const auto &FlagStr : CallSiteYAML.flags ) {
239227 if (FlagStr == " InternalCall" ) {
240228 CSI.Flags |= static_cast <uint8_t >(CallSiteInfo::InternalCall);
241229 } else if (FlagStr == " ExternalCall" ) {
242230 CSI.Flags |= static_cast <uint8_t >(CallSiteInfo::ExternalCall);
243231 } else {
244- return llvm:: createStringError (std::errc::invalid_argument,
245- " Unknown flag in callsite YAML: %s\n " ,
246- FlagStr.c_str ());
232+ return createStringError (std::errc::invalid_argument,
233+ " Unknown flag in callsite YAML: %s\n " ,
234+ FlagStr.c_str ());
247235 }
248236 }
249237 FuncInfo->CallSites ->CallSites .push_back (CSI);
250238 }
251239 }
252- return llvm:: Error::success ();
240+ return Error::success ();
253241}
254242
255- raw_ostream &llvm:: gsym::operator <<(raw_ostream &OS, const CallSiteInfo &CSI) {
243+ raw_ostream &gsym::operator <<(raw_ostream &OS, const CallSiteInfo &CSI) {
256244 OS << " Return=" << HEX64 (CSI.ReturnAddress );
257245 OS << " Flags=" << HEX8 (CSI.Flags );
258246
@@ -265,8 +253,8 @@ raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const CallSiteInfo &CSI) {
265253 return OS;
266254}
267255
268- raw_ostream &llvm:: gsym::operator <<(raw_ostream &OS,
269- const CallSiteInfoCollection &CSIC) {
256+ raw_ostream &gsym::operator <<(raw_ostream &OS,
257+ const CallSiteInfoCollection &CSIC) {
270258 for (const auto &CS : CSIC.CallSites ) {
271259 OS << CS;
272260 OS << " \n " ;
0 commit comments