This change implements the profile loading functionality in LLVM to
support XRay's profiling mode in compiler-rt.
We introduce a type named llvm::xray::Profile which allows building a
profile representation. We can load an XRay profile from a file to build
Profile instances, or do it manually through the Profile type's API.
The intent is to get the llvm-xray tool to generate Profile
instances and use that as the common abstraction through which all
conversion and analysis can be done. In the future we can generate
Profile instances from Trace instances as well, through conversion
functions.
Some of the key operations supported by the Profile API are:
- Path interning (Profile::internPath(...)) which returns a unique path identifier.
- Block appending (Profile::addBlock(...)) to add thread-associated profile information.
- Path ID to Path lookup (Profile::expandPath(...)) to look up a PathID and return the original interned path.
- Block iteration.
A 'Path' in this context represents the function call stack in
leaf-to-root order. This is represented as a path in an internally
managed prefix tree in the Profile instance. Having a handle (PathID)
to identify the unique Paths we encounter for a particular Profile
allows us to reduce the amount of memory required to associate profile
data to a particular Path.
This is the first of a series of patches to migrate the llvm-stacks
tool towards using a single profile representation.
Depends on D48653.