mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[DWARFYAML] Add helper function getDWARFEmitterByName(). NFC.
In this patch, we add a helper function getDWARFEmitterByName(). This function returns the proper DWARF section emitting method by the name. Reviewed By: jhenderson Differential Revision: https://reviews.llvm.org/D84952
This commit is contained in:
parent
65b9283070
commit
3bfc8f644d
@ -43,6 +43,8 @@ Error emitDebugAddr(raw_ostream &OS, const Data &DI);
|
||||
Error emitDebugStrOffsets(raw_ostream &OS, const Data &DI);
|
||||
Error emitDebugRnglists(raw_ostream &OS, const Data &DI);
|
||||
|
||||
std::function<Error(raw_ostream &, const Data &)>
|
||||
getDWARFEmitterByName(StringRef SecName);
|
||||
Expected<StringMap<std::unique_ptr<MemoryBuffer>>>
|
||||
emitDebugSections(StringRef YAMLString,
|
||||
bool IsLittleEndian = sys::IsLittleEndianHost);
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/BinaryFormat/Dwarf.h"
|
||||
#include "llvm/ObjectYAML/DWARFYAML.h"
|
||||
#include "llvm/Support/Errc.h"
|
||||
@ -762,14 +763,40 @@ Error DWARFYAML::emitDebugRnglists(raw_ostream &OS, const Data &DI) {
|
||||
OS, *DI.DebugRnglists, DI.IsLittleEndian, DI.Is64BitAddrSize);
|
||||
}
|
||||
|
||||
using EmitFuncType = Error (*)(raw_ostream &, const DWARFYAML::Data &);
|
||||
std::function<Error(raw_ostream &, const DWARFYAML::Data &)>
|
||||
DWARFYAML::getDWARFEmitterByName(StringRef SecName) {
|
||||
auto EmitFunc =
|
||||
StringSwitch<
|
||||
std::function<Error(raw_ostream &, const DWARFYAML::Data &)>>(SecName)
|
||||
.Case("debug_abbrev", DWARFYAML::emitDebugAbbrev)
|
||||
.Case("debug_addr", DWARFYAML::emitDebugAddr)
|
||||
.Case("debug_aranges", DWARFYAML::emitDebugAranges)
|
||||
.Case("debug_gnu_pubnames", DWARFYAML::emitDebugGNUPubnames)
|
||||
.Case("debug_gnu_pubtypes", DWARFYAML::emitDebugGNUPubtypes)
|
||||
.Case("debug_info", DWARFYAML::emitDebugInfo)
|
||||
.Case("debug_line", DWARFYAML::emitDebugLine)
|
||||
.Case("debug_pubnames", DWARFYAML::emitDebugPubnames)
|
||||
.Case("debug_pubtypes", DWARFYAML::emitDebugPubtypes)
|
||||
.Case("debug_ranges", DWARFYAML::emitDebugRanges)
|
||||
.Case("debug_rnglists", DWARFYAML::emitDebugRnglists)
|
||||
.Case("debug_str", DWARFYAML::emitDebugStr)
|
||||
.Case("debug_str_offsets", DWARFYAML::emitDebugStrOffsets)
|
||||
.Default([&](raw_ostream &, const DWARFYAML::Data &) {
|
||||
return createStringError(errc::not_supported,
|
||||
SecName + " is not supported");
|
||||
});
|
||||
|
||||
return EmitFunc;
|
||||
}
|
||||
|
||||
static Error
|
||||
emitDebugSectionImpl(const DWARFYAML::Data &DI, EmitFuncType EmitFunc,
|
||||
StringRef Sec,
|
||||
emitDebugSectionImpl(const DWARFYAML::Data &DI, StringRef Sec,
|
||||
StringMap<std::unique_ptr<MemoryBuffer>> &OutputBuffers) {
|
||||
std::string Data;
|
||||
raw_string_ostream DebugInfoStream(Data);
|
||||
|
||||
auto EmitFunc = DWARFYAML::getDWARFEmitterByName(Sec);
|
||||
|
||||
if (Error Err = EmitFunc(DebugInfoStream, DI))
|
||||
return Err;
|
||||
DebugInfoStream.flush();
|
||||
@ -796,23 +823,12 @@ DWARFYAML::emitDebugSections(StringRef YAMLString, bool IsLittleEndian) {
|
||||
return createStringError(YIn.error(), GeneratedDiag.getMessage());
|
||||
|
||||
StringMap<std::unique_ptr<MemoryBuffer>> DebugSections;
|
||||
Error Err = emitDebugSectionImpl(DI, &DWARFYAML::emitDebugInfo, "debug_info",
|
||||
DebugSections);
|
||||
Err = joinErrors(std::move(Err),
|
||||
emitDebugSectionImpl(DI, &DWARFYAML::emitDebugLine,
|
||||
"debug_line", DebugSections));
|
||||
Err = joinErrors(std::move(Err),
|
||||
emitDebugSectionImpl(DI, &DWARFYAML::emitDebugStr,
|
||||
"debug_str", DebugSections));
|
||||
Err = joinErrors(std::move(Err),
|
||||
emitDebugSectionImpl(DI, &DWARFYAML::emitDebugAbbrev,
|
||||
"debug_abbrev", DebugSections));
|
||||
Err = joinErrors(std::move(Err),
|
||||
emitDebugSectionImpl(DI, &DWARFYAML::emitDebugAranges,
|
||||
"debug_aranges", DebugSections));
|
||||
Err = joinErrors(std::move(Err),
|
||||
emitDebugSectionImpl(DI, &DWARFYAML::emitDebugRanges,
|
||||
"debug_ranges", DebugSections));
|
||||
Error Err = Error::success();
|
||||
cantFail(std::move(Err));
|
||||
|
||||
for (StringRef SecName : DI.getNonEmptySectionNames())
|
||||
Err = joinErrors(std::move(Err),
|
||||
emitDebugSectionImpl(DI, SecName, DebugSections));
|
||||
|
||||
if (Err)
|
||||
return std::move(Err);
|
||||
|
@ -949,39 +949,9 @@ Expected<uint64_t> emitDWARF(typename ELFT::Shdr &SHeader, StringRef Name,
|
||||
return 0;
|
||||
|
||||
uint64_t BeginOffset = CBA.tell();
|
||||
Error Err = Error::success();
|
||||
cantFail(std::move(Err));
|
||||
|
||||
if (Name == ".debug_str")
|
||||
Err = DWARFYAML::emitDebugStr(*OS, DWARF);
|
||||
else if (Name == ".debug_aranges")
|
||||
Err = DWARFYAML::emitDebugAranges(*OS, DWARF);
|
||||
else if (Name == ".debug_ranges")
|
||||
Err = DWARFYAML::emitDebugRanges(*OS, DWARF);
|
||||
else if (Name == ".debug_line")
|
||||
Err = DWARFYAML::emitDebugLine(*OS, DWARF);
|
||||
else if (Name == ".debug_addr")
|
||||
Err = DWARFYAML::emitDebugAddr(*OS, DWARF);
|
||||
else if (Name == ".debug_abbrev")
|
||||
Err = DWARFYAML::emitDebugAbbrev(*OS, DWARF);
|
||||
else if (Name == ".debug_info")
|
||||
Err = DWARFYAML::emitDebugInfo(*OS, DWARF);
|
||||
else if (Name == ".debug_pubnames")
|
||||
Err = DWARFYAML::emitDebugPubnames(*OS, DWARF);
|
||||
else if (Name == ".debug_pubtypes")
|
||||
Err = DWARFYAML::emitDebugPubtypes(*OS, DWARF);
|
||||
else if (Name == ".debug_gnu_pubnames")
|
||||
Err = DWARFYAML::emitDebugGNUPubnames(*OS, DWARF);
|
||||
else if (Name == ".debug_gnu_pubtypes")
|
||||
Err = DWARFYAML::emitDebugGNUPubtypes(*OS, DWARF);
|
||||
else if (Name == ".debug_str_offsets")
|
||||
Err = DWARFYAML::emitDebugStrOffsets(*OS, DWARF);
|
||||
else if (Name == ".debug_rnglists")
|
||||
Err = DWARFYAML::emitDebugRnglists(*OS, DWARF);
|
||||
else
|
||||
llvm_unreachable("unexpected emitDWARF() call");
|
||||
|
||||
if (Err)
|
||||
auto EmitFunc = DWARFYAML::getDWARFEmitterByName(Name.substr(1));
|
||||
if (Error Err = EmitFunc(*OS, DWARF))
|
||||
return std::move(Err);
|
||||
|
||||
return CBA.tell() - BeginOffset;
|
||||
|
Loading…
Reference in New Issue
Block a user