X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fdsymutil%2FDebugMap.h;h=d0edbabb404bae8b57427676add85f52c30f817f;hb=2da1484e97dad97f24ef1686480853bdf70fe836;hp=5bcf7a53b99aa8984676830b53d0576edee57eb7;hpb=a646d2705f50c236de2d58ca3b9522d9ecdc1302;p=oota-llvm.git diff --git a/tools/dsymutil/DebugMap.h b/tools/dsymutil/DebugMap.h index 5bcf7a53b99..d0edbabb404 100644 --- a/tools/dsymutil/DebugMap.h +++ b/tools/dsymutil/DebugMap.h @@ -28,6 +28,8 @@ #include "llvm/Object/ObjectFile.h" #include "llvm/Support/ErrorOr.h" #include "llvm/Support/Format.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/YAMLTraits.h" #include namespace llvm { @@ -66,6 +68,12 @@ class DebugMap { typedef std::vector> ObjectContainer; ObjectContainer Objects; + /// For YAML IO support. + ///@{ + friend yaml::MappingTraits>; + friend yaml::MappingTraits; + DebugMap() = default; + ///@} public: DebugMap(const Triple &BinaryTriple) : BinaryTriple(BinaryTriple) {} @@ -90,6 +98,10 @@ public: #ifndef NDEBUG void dump() const; #endif + + /// Read a debug map for \a InputFile. + static ErrorOr> + parseYAMLDebugMap(StringRef InputFile, StringRef PrependPath, bool Verbose); }; /// \brief The DebugMapObject represents one object file described by @@ -99,10 +111,14 @@ public: class DebugMapObject { public: struct SymbolMapping { - uint64_t ObjectAddress; - uint64_t BinaryAddress; - SymbolMapping(uint64_t ObjectAddress, uint64_t BinaryAddress) - : ObjectAddress(ObjectAddress), BinaryAddress(BinaryAddress) {} + yaml::Hex64 ObjectAddress; + yaml::Hex64 BinaryAddress; + yaml::Hex32 Size; + SymbolMapping(uint64_t ObjectAddress, uint64_t BinaryAddress, uint32_t Size) + : ObjectAddress(ObjectAddress), BinaryAddress(BinaryAddress), + Size(Size) {} + /// For YAML IO support + SymbolMapping() = default; }; typedef StringMapEntry DebugMapEntry; @@ -111,7 +127,7 @@ public: /// \returns false if the symbol was already registered. The request /// is discarded in this case. bool addSymbol(llvm::StringRef SymName, uint64_t ObjectAddress, - uint64_t LinkedAddress); + uint64_t LinkedAddress, uint32_t Size); /// \brief Lookup a symbol mapping. /// \returns null if the symbol isn't found. @@ -123,6 +139,10 @@ public: llvm::StringRef getObjectFilename() const { return Filename; } + iterator_range::const_iterator> symbols() const { + return make_range(Symbols.begin(), Symbols.end()); + } + void print(raw_ostream &OS) const; #ifndef NDEBUG void dump() const; @@ -135,6 +155,72 @@ private: std::string Filename; StringMap Symbols; DenseMap AddressToMapping; + + /// For YAMLIO support. + ///@{ + typedef std::pair YAMLSymbolMapping; + friend yaml::MappingTraits; + friend yaml::SequenceTraits>>; + friend yaml::SequenceTraits>; + DebugMapObject() = default; + +public: + DebugMapObject &operator=(DebugMapObject RHS) { + std::swap(Filename, RHS.Filename); + std::swap(Symbols, RHS.Symbols); + std::swap(AddressToMapping, RHS.AddressToMapping); + return *this; + } + DebugMapObject(DebugMapObject &&RHS) { + Filename = std::move(RHS.Filename); + Symbols = std::move(RHS.Symbols); + AddressToMapping = std::move(RHS.AddressToMapping); + } + ///@} +}; +} +} + +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::dsymutil::DebugMapObject::YAMLSymbolMapping) + +namespace llvm { +namespace yaml { + +using namespace llvm::dsymutil; + +template <> +struct MappingTraits> { + static void mapping(IO &io, + std::pair &s); + static const bool flow = true; +}; + +template <> struct MappingTraits { + struct YamlDMO; + static void mapping(IO &io, dsymutil::DebugMapObject &DMO); +}; + +template <> struct ScalarTraits { + static void output(const Triple &val, void *, llvm::raw_ostream &out); + static StringRef input(StringRef scalar, void *, Triple &value); + static bool mustQuote(StringRef) { return true; } +}; + +template <> +struct SequenceTraits>> { + static size_t + size(IO &io, std::vector> &seq); + static dsymutil::DebugMapObject & + element(IO &, std::vector> &seq, + size_t index); +}; + +template <> struct MappingTraits { + static void mapping(IO &io, dsymutil::DebugMap &DM); +}; + +template <> struct MappingTraits> { + static void mapping(IO &io, std::unique_ptr &DM); }; } }