/// For YAML IO support.
///@{
- friend yaml::MappingTraits<std::unique_ptr<DebugMap>>;
friend yaml::MappingTraits<DebugMap>;
DebugMap() = default;
///@}
};
template <> struct MappingTraits<dsymutil::DebugMapObject> {
- // Normalize/Denormalize between YAML and a DebugMapObject.
- struct YamlDMO {
- YamlDMO(IO &io) {}
-
- YamlDMO(IO &io, dsymutil::DebugMapObject &Obj) {
- Filename = Obj.Filename;
- Entries.reserve(Obj.Symbols.size());
- for (auto &Entry : Obj.Symbols)
+ typedef StringMap<dsymutil::DebugMapObject::SymbolMapping> SymbolMap;
+
+ struct SequencedStringMap {
+ SequencedStringMap(IO &io) {}
+
+ SequencedStringMap(IO &io, SymbolMap &Map) {
+ Entries.reserve(Map.size());
+ for (auto &Entry : Map)
Entries.push_back(std::make_pair(Entry.getKey(), Entry.getValue()));
}
- dsymutil::DebugMapObject denormalize(IO &) {
- dsymutil::DebugMapObject Res(Filename);
- for (auto &Entry : Entries) {
- auto &Mapping = Entry.second;
- Res.addSymbol(Entry.first, Mapping.ObjectAddress, Mapping.BinaryAddress,
- Mapping.Size);
- }
+ SymbolMap denormalize(IO &) {
+ SymbolMap Res;
+
+ for (auto &Entry : Entries)
+ Res[Entry.first] = Entry.second;
+
return Res;
}
- std::string Filename;
std::vector<dsymutil::DebugMapObject::YAMLSymbolMapping> Entries;
};
- static void mapping(IO &io, dsymutil::DebugMapObject &DMO) {
- MappingNormalization<YamlDMO, dsymutil::DebugMapObject> Norm(io, DMO);
- io.mapRequired("filename", Norm->Filename);
- io.mapRequired("symbols", Norm->Entries);
+ static void mapping(IO &io, dsymutil::DebugMapObject &s) {
+ MappingNormalization<SequencedStringMap, SymbolMap> seq(io, s.Symbols);
+ io.mapRequired("filename", s.Filename);
+ io.mapRequired("symbols", seq->Entries);
}
};
static StringRef input(StringRef scalar, void *, Triple &value) {
value = Triple(scalar);
- return StringRef();
+ return value.str();
}
static bool mustQuote(StringRef) { return true; }
io.mapOptional("objects", DM.Objects);
}
};
-
- template <> struct MappingTraits<std::unique_ptr<dsymutil::DebugMap>> {
- static void mapping(IO &io, std::unique_ptr<dsymutil::DebugMap> &DM) {
- if (!DM)
- DM.reset(new DebugMap());
- io.mapRequired("triple", DM->BinaryTriple);
- io.mapOptional("objects", DM->Objects);
- }
-};
}
}
}
}
-ErrorOr<std::unique_ptr<DebugMap>>
-parseYAMLDebugMap(StringRef InputFile, bool Verbose) {
- auto ErrOrFile = MemoryBuffer::getFileOrSTDIN(InputFile);
- if (auto Err =ErrOrFile.getError())
- return Err;
-
- std::unique_ptr<DebugMap> Res;
- yaml::Input yin((*ErrOrFile)->getBuffer());
- yin >> Res;
-
- if (auto EC = yin.error())
- return EC;
-
- return std::move(Res);
-}
-
namespace llvm {
namespace dsymutil {
llvm::ErrorOr<std::unique_ptr<DebugMap>>
-parseDebugMap(StringRef InputFile, StringRef PrependPath, bool Verbose, bool InputIsYAML) {
- if (!InputIsYAML) {
- MachODebugMapParser Parser(InputFile, PrependPath, Verbose);
- return Parser.parse();
- } else {
- return parseYAMLDebugMap(InputFile, Verbose);
- }
+parseDebugMap(StringRef InputFile, StringRef PrependPath, bool Verbose) {
+ MachODebugMapParser Parser(InputFile, PrependPath, Verbose);
+ return Parser.parse();
}
}
}
desc("Parse and dump the debug map to standard output. Not DWARF link "
"will take place."),
init(false));
-
-static opt<bool> InputIsYAMLDebugMap(
- "y", desc("Treat the input file is a YAML debug map rather than a binary."),
- init(false));
}
int main(int argc, char **argv) {
LinkOptions Options;
llvm::cl::ParseCommandLineOptions(argc, argv, "llvm dsymutil\n");
-
- auto DebugMapPtrOrErr =
- parseDebugMap(InputFile, OsoPrependPath, Verbose, InputIsYAMLDebugMap);
+ auto DebugMapPtrOrErr = parseDebugMap(InputFile, OsoPrependPath, Verbose);
Options.Verbose = Verbose;
Options.NoOutput = NoOutput;
/// \brief Extract the DebugMap from the given file.
/// The file has to be a MachO object file.
llvm::ErrorOr<std::unique_ptr<DebugMap>>
-parseDebugMap(StringRef InputFile, StringRef PrependPath,
- bool Verbose, bool InputIsYAML);
+parseDebugMap(StringRef InputFile, StringRef PrependPath = "",
+ bool Verbose = false);
/// \brief Link the Dwarf debuginfo as directed by the passed DebugMap
/// \p DM into a DwarfFile named \p OutputFilename.