mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-27 12:26:08 +00:00
Reapply r238941 - [dsymutil] Accept a YAML debug map as input instead of a binary.
With a couple more constructors that GCC thinks are necessary. Original commit message: [dsymutil] Accept a YAML debug map as input instead of a binary. To do this, the user needs to pass the new -y flag. As it wasn't tested before, the debug map YAML deserialization was completely buggy (mainly because the DebugMapObject has a dual mapping that allows to search by name and by address, but only the StringMap got populated). It's fixed and tested in this commit by augmenting some test with a 2 stage dwarf link: a frist llvm-dsymutil reads the debug map and pipes it in a second instance that does the actual link without touching the initial binary. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238959 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -6,6 +6,8 @@ RUN: llvm-dsymutil -o %t2 -oso-prepend-path=%p/.. %p/../Inputs/basic.macho.x86_6
|
|||||||
RUN: llvm-dwarfdump %t2 | FileCheck %s
|
RUN: llvm-dwarfdump %t2 | FileCheck %s
|
||||||
RUN: llvm-dsymutil -o - -oso-prepend-path=%p/.. %p/../Inputs/basic.macho.x86_64 | llvm-dwarfdump - | FileCheck %s --check-prefix=CHECK --check-prefix=BASIC
|
RUN: llvm-dsymutil -o - -oso-prepend-path=%p/.. %p/../Inputs/basic.macho.x86_64 | llvm-dwarfdump - | FileCheck %s --check-prefix=CHECK --check-prefix=BASIC
|
||||||
RUN: llvm-dsymutil -o - -oso-prepend-path=%p/.. %p/../Inputs/basic-archive.macho.x86_64 | llvm-dwarfdump - | FileCheck %s --check-prefix=CHECK --check-prefix=ARCHIVE
|
RUN: llvm-dsymutil -o - -oso-prepend-path=%p/.. %p/../Inputs/basic-archive.macho.x86_64 | llvm-dwarfdump - | FileCheck %s --check-prefix=CHECK --check-prefix=ARCHIVE
|
||||||
|
RUN: llvm-dsymutil -dump-debug-map -oso-prepend-path=%p/.. %p/../Inputs/basic.macho.x86_64 | llvm-dsymutil -y -o - - | llvm-dwarfdump - | FileCheck %s --check-prefix=CHECK --check-prefix=BASIC
|
||||||
|
RUN: llvm-dsymutil -dump-debug-map -oso-prepend-path=%p/.. %p/../Inputs/basic-archive.macho.x86_64 | llvm-dsymutil -o - -oso-prepend-path=%p/.. -y - | llvm-dwarfdump - | FileCheck %s --check-prefix=CHECK --check-prefix=ARCHIVE
|
||||||
|
|
||||||
CHECK: file format Mach-O 64-bit x86-64
|
CHECK: file format Mach-O 64-bit x86-64
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
REQUIRES: shell
|
REQUIRES: shell
|
||||||
RUN: llvm-dsymutil -o - -oso-prepend-path=%p/.. %p/../Inputs/basic-lto.macho.x86_64 | llvm-dwarfdump - | FileCheck %s
|
RUN: llvm-dsymutil -o - -oso-prepend-path=%p/.. %p/../Inputs/basic-lto.macho.x86_64 | llvm-dwarfdump - | FileCheck %s
|
||||||
|
RUN: llvm-dsymutil -oso-prepend-path=%p/.. -dump-debug-map %p/../Inputs/basic-lto.macho.x86_64 | llvm-dsymutil -o - -oso-prepend-path=%p/.. -y - | llvm-dwarfdump - | FileCheck %s
|
||||||
|
|
||||||
CHECK: file format Mach-O 64-bit x86-64
|
CHECK: file format Mach-O 64-bit x86-64
|
||||||
|
|
||||||
|
@@ -69,6 +69,7 @@ class DebugMap {
|
|||||||
|
|
||||||
/// For YAML IO support.
|
/// For YAML IO support.
|
||||||
///@{
|
///@{
|
||||||
|
friend yaml::MappingTraits<std::unique_ptr<DebugMap>>;
|
||||||
friend yaml::MappingTraits<DebugMap>;
|
friend yaml::MappingTraits<DebugMap>;
|
||||||
DebugMap() = default;
|
DebugMap() = default;
|
||||||
///@}
|
///@}
|
||||||
@@ -157,6 +158,18 @@ private:
|
|||||||
friend yaml::SequenceTraits<std::vector<std::unique_ptr<DebugMapObject>>>;
|
friend yaml::SequenceTraits<std::vector<std::unique_ptr<DebugMapObject>>>;
|
||||||
friend yaml::SequenceTraits<std::vector<YAMLSymbolMapping>>;
|
friend yaml::SequenceTraits<std::vector<YAMLSymbolMapping>>;
|
||||||
DebugMapObject() = default;
|
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);
|
||||||
|
}
|
||||||
///@}
|
///@}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -184,33 +197,35 @@ struct MappingTraits<std::pair<std::string, DebugMapObject::SymbolMapping>> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <> struct MappingTraits<dsymutil::DebugMapObject> {
|
template <> struct MappingTraits<dsymutil::DebugMapObject> {
|
||||||
typedef StringMap<dsymutil::DebugMapObject::SymbolMapping> SymbolMap;
|
// Normalize/Denormalize between YAML and a DebugMapObject.
|
||||||
|
struct YamlDMO {
|
||||||
|
YamlDMO(IO &io) {}
|
||||||
|
|
||||||
struct SequencedStringMap {
|
YamlDMO(IO &io, dsymutil::DebugMapObject &Obj) {
|
||||||
SequencedStringMap(IO &io) {}
|
Filename = Obj.Filename;
|
||||||
|
Entries.reserve(Obj.Symbols.size());
|
||||||
SequencedStringMap(IO &io, SymbolMap &Map) {
|
for (auto &Entry : Obj.Symbols)
|
||||||
Entries.reserve(Map.size());
|
|
||||||
for (auto &Entry : Map)
|
|
||||||
Entries.push_back(std::make_pair(Entry.getKey(), Entry.getValue()));
|
Entries.push_back(std::make_pair(Entry.getKey(), Entry.getValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SymbolMap denormalize(IO &) {
|
dsymutil::DebugMapObject denormalize(IO &) {
|
||||||
SymbolMap Res;
|
dsymutil::DebugMapObject Res(Filename);
|
||||||
|
for (auto &Entry : Entries) {
|
||||||
for (auto &Entry : Entries)
|
auto &Mapping = Entry.second;
|
||||||
Res[Entry.first] = Entry.second;
|
Res.addSymbol(Entry.first, Mapping.ObjectAddress, Mapping.BinaryAddress,
|
||||||
|
Mapping.Size);
|
||||||
|
}
|
||||||
return Res;
|
return Res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Filename;
|
||||||
std::vector<dsymutil::DebugMapObject::YAMLSymbolMapping> Entries;
|
std::vector<dsymutil::DebugMapObject::YAMLSymbolMapping> Entries;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void mapping(IO &io, dsymutil::DebugMapObject &s) {
|
static void mapping(IO &io, dsymutil::DebugMapObject &DMO) {
|
||||||
MappingNormalization<SequencedStringMap, SymbolMap> seq(io, s.Symbols);
|
MappingNormalization<YamlDMO, dsymutil::DebugMapObject> Norm(io, DMO);
|
||||||
io.mapRequired("filename", s.Filename);
|
io.mapRequired("filename", Norm->Filename);
|
||||||
io.mapRequired("symbols", seq->Entries);
|
io.mapRequired("symbols", Norm->Entries);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -222,7 +237,7 @@ template <> struct ScalarTraits<Triple> {
|
|||||||
|
|
||||||
static StringRef input(StringRef scalar, void *, Triple &value) {
|
static StringRef input(StringRef scalar, void *, Triple &value) {
|
||||||
value = Triple(scalar);
|
value = Triple(scalar);
|
||||||
return value.str();
|
return StringRef();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mustQuote(StringRef) { return true; }
|
static bool mustQuote(StringRef) { return true; }
|
||||||
@@ -253,6 +268,15 @@ template <> struct MappingTraits<dsymutil::DebugMap> {
|
|||||||
io.mapOptional("objects", DM.Objects);
|
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);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -242,12 +242,32 @@ void MachODebugMapParser::loadMainBinarySymbols() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 llvm {
|
||||||
namespace dsymutil {
|
namespace dsymutil {
|
||||||
llvm::ErrorOr<std::unique_ptr<DebugMap>>
|
llvm::ErrorOr<std::unique_ptr<DebugMap>>
|
||||||
parseDebugMap(StringRef InputFile, StringRef PrependPath, bool Verbose) {
|
parseDebugMap(StringRef InputFile, StringRef PrependPath, bool Verbose, bool InputIsYAML) {
|
||||||
MachODebugMapParser Parser(InputFile, PrependPath, Verbose);
|
if (!InputIsYAML) {
|
||||||
return Parser.parse();
|
MachODebugMapParser Parser(InputFile, PrependPath, Verbose);
|
||||||
|
return Parser.parse();
|
||||||
|
} else {
|
||||||
|
return parseYAMLDebugMap(InputFile, Verbose);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -52,6 +52,10 @@ static opt<bool> DumpDebugMap(
|
|||||||
desc("Parse and dump the debug map to standard output. Not DWARF link "
|
desc("Parse and dump the debug map to standard output. Not DWARF link "
|
||||||
"will take place."),
|
"will take place."),
|
||||||
init(false));
|
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) {
|
int main(int argc, char **argv) {
|
||||||
@@ -61,7 +65,9 @@ int main(int argc, char **argv) {
|
|||||||
LinkOptions Options;
|
LinkOptions Options;
|
||||||
|
|
||||||
llvm::cl::ParseCommandLineOptions(argc, argv, "llvm dsymutil\n");
|
llvm::cl::ParseCommandLineOptions(argc, argv, "llvm dsymutil\n");
|
||||||
auto DebugMapPtrOrErr = parseDebugMap(InputFile, OsoPrependPath, Verbose);
|
|
||||||
|
auto DebugMapPtrOrErr =
|
||||||
|
parseDebugMap(InputFile, OsoPrependPath, Verbose, InputIsYAMLDebugMap);
|
||||||
|
|
||||||
Options.Verbose = Verbose;
|
Options.Verbose = Verbose;
|
||||||
Options.NoOutput = NoOutput;
|
Options.NoOutput = NoOutput;
|
||||||
|
@@ -34,8 +34,8 @@ struct LinkOptions {
|
|||||||
/// \brief Extract the DebugMap from the given file.
|
/// \brief Extract the DebugMap from the given file.
|
||||||
/// The file has to be a MachO object file.
|
/// The file has to be a MachO object file.
|
||||||
llvm::ErrorOr<std::unique_ptr<DebugMap>>
|
llvm::ErrorOr<std::unique_ptr<DebugMap>>
|
||||||
parseDebugMap(StringRef InputFile, StringRef PrependPath = "",
|
parseDebugMap(StringRef InputFile, StringRef PrependPath,
|
||||||
bool Verbose = false);
|
bool Verbose, bool InputIsYAML);
|
||||||
|
|
||||||
/// \brief Link the Dwarf debuginfo as directed by the passed DebugMap
|
/// \brief Link the Dwarf debuginfo as directed by the passed DebugMap
|
||||||
/// \p DM into a DwarfFile named \p OutputFilename.
|
/// \p DM into a DwarfFile named \p OutputFilename.
|
||||||
|
Reference in New Issue
Block a user