mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-10 14:36:01 +00:00
llvm-objdump: Replace the -macho -raw option with a generic -raw-clang-ast
option that works with all object container formats. Now that clang modules/PCH are object containers this option is useful to to construct pipes like llvm-objdump -raw-clang-ast foo.pcm | llvm-bcanalyzer - to inspect the AST contents in a PCH container. Will be tested via clang. Belatedly addresses review feedback for r233390. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241659 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7bcdaa6978
commit
54a2768153
@ -1,5 +1,3 @@
|
|||||||
# RUN: llvm-objdump -macho -section=__data %p/Inputs/bind2.macho-x86_64 | FileCheck %s
|
# RUN: llvm-objdump -macho -section=__data %p/Inputs/bind2.macho-x86_64 | FileCheck %s
|
||||||
# RUN: llvm-objdump -macho -section=__data -raw %p/Inputs/bind2.macho-x86_64 | FileCheck --check-prefix=RAW %s
|
|
||||||
|
|
||||||
# CHECK: bind2.macho-x86_64:
|
# CHECK: bind2.macho-x86_64:
|
||||||
# RAW-NOT: bind2.macho-x86_64:
|
|
||||||
|
@ -102,9 +102,6 @@ cl::list<std::string>
|
|||||||
cl::desc("Prints the specified segment,section for "
|
cl::desc("Prints the specified segment,section for "
|
||||||
"Mach-O objects (requires -macho)"));
|
"Mach-O objects (requires -macho)"));
|
||||||
|
|
||||||
cl::opt<bool> llvm::Raw("raw",
|
|
||||||
cl::desc("Have -section dump the raw binary contents"));
|
|
||||||
|
|
||||||
cl::opt<bool>
|
cl::opt<bool>
|
||||||
llvm::InfoPlist("info-plist",
|
llvm::InfoPlist("info-plist",
|
||||||
cl::desc("Print the info plist section as strings for "
|
cl::desc("Print the info plist section as strings for "
|
||||||
@ -1046,11 +1043,6 @@ static void DumpSectionContents(StringRef Filename, MachOObjectFile *O,
|
|||||||
uint32_t sect_size = BytesStr.size();
|
uint32_t sect_size = BytesStr.size();
|
||||||
uint64_t sect_addr = Section.getAddress();
|
uint64_t sect_addr = Section.getAddress();
|
||||||
|
|
||||||
if (Raw) {
|
|
||||||
outs().write(BytesStr.data(), BytesStr.size());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
outs() << "Contents of (" << SegName << "," << SectName
|
outs() << "Contents of (" << SegName << "," << SectName
|
||||||
<< ") section\n";
|
<< ") section\n";
|
||||||
|
|
||||||
@ -1179,8 +1171,7 @@ static void ProcessMachO(StringRef Filename, MachOObjectFile *MachOOF,
|
|||||||
// UniversalHeaders or ArchiveHeaders.
|
// UniversalHeaders or ArchiveHeaders.
|
||||||
if (Disassemble || PrivateHeaders || ExportsTrie || Rebase || Bind ||
|
if (Disassemble || PrivateHeaders || ExportsTrie || Rebase || Bind ||
|
||||||
LazyBind || WeakBind || IndirectSymbols || DataInCode || LinkOptHints ||
|
LazyBind || WeakBind || IndirectSymbols || DataInCode || LinkOptHints ||
|
||||||
DylibsUsed || DylibId || ObjcMetaData ||
|
DylibsUsed || DylibId || ObjcMetaData || (DumpSections.size() != 0)) {
|
||||||
(DumpSections.size() != 0 && !Raw)) {
|
|
||||||
outs() << Filename;
|
outs() << Filename;
|
||||||
if (!ArchiveMemberName.empty())
|
if (!ArchiveMemberName.empty())
|
||||||
outs() << '(' << ArchiveMemberName << ')';
|
outs() << '(' << ArchiveMemberName << ')';
|
||||||
|
@ -96,6 +96,10 @@ llvm::LazyBind("lazy-bind", cl::desc("Display mach-o lazy binding info"));
|
|||||||
cl::opt<bool>
|
cl::opt<bool>
|
||||||
llvm::WeakBind("weak-bind", cl::desc("Display mach-o weak binding info"));
|
llvm::WeakBind("weak-bind", cl::desc("Display mach-o weak binding info"));
|
||||||
|
|
||||||
|
cl::opt<bool>
|
||||||
|
llvm::RawClangAST("raw-clang-ast",
|
||||||
|
cl::desc("Dump the raw binary contents of the clang AST section"));
|
||||||
|
|
||||||
static cl::opt<bool>
|
static cl::opt<bool>
|
||||||
MachOOpt("macho", cl::desc("Use MachO specific object file parser"));
|
MachOOpt("macho", cl::desc("Use MachO specific object file parser"));
|
||||||
static cl::alias
|
static cl::alias
|
||||||
@ -1297,6 +1301,43 @@ void llvm::printWeakBindTable(const ObjectFile *o) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Dump the raw contents of the __clangast section so the output can be piped
|
||||||
|
/// into llvm-bcanalyzer.
|
||||||
|
void llvm::printRawClangAST(const ObjectFile *Obj) {
|
||||||
|
if (outs().is_displayed()) {
|
||||||
|
errs() << "The -raw-clang-ast option will dump the raw binary contents of "
|
||||||
|
"the clang ast section.\n"
|
||||||
|
"Please redirect the output to a file or another program such as "
|
||||||
|
"llvm-bcanalyzer.\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringRef ClangASTSectionName("__clangast");
|
||||||
|
if (isa<COFFObjectFile>(Obj)) {
|
||||||
|
ClangASTSectionName = "clangast";
|
||||||
|
}
|
||||||
|
|
||||||
|
Optional<object::SectionRef> ClangASTSection;
|
||||||
|
for (auto Sec : Obj->sections()) {
|
||||||
|
StringRef Name;
|
||||||
|
Sec.getName(Name);
|
||||||
|
if (Name == ClangASTSectionName) {
|
||||||
|
ClangASTSection = Sec;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!ClangASTSection)
|
||||||
|
return;
|
||||||
|
|
||||||
|
StringRef ClangASTContents;
|
||||||
|
if (error(ClangASTSection.getValue().getContents(ClangASTContents))) {
|
||||||
|
errs() << "Could not read the " << ClangASTSectionName << " section!\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
outs().write(ClangASTContents.data(), ClangASTContents.size());
|
||||||
|
}
|
||||||
|
|
||||||
static void printFaultMaps(const ObjectFile *Obj) {
|
static void printFaultMaps(const ObjectFile *Obj) {
|
||||||
const char *FaultMapSectionName = nullptr;
|
const char *FaultMapSectionName = nullptr;
|
||||||
|
|
||||||
@ -1351,9 +1392,12 @@ static void printPrivateFileHeader(const ObjectFile *o) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void DumpObject(const ObjectFile *o) {
|
static void DumpObject(const ObjectFile *o) {
|
||||||
outs() << '\n';
|
// Avoid other output when using a raw option.
|
||||||
outs() << o->getFileName()
|
if (!RawClangAST) {
|
||||||
<< ":\tfile format " << o->getFileFormatName() << "\n\n";
|
outs() << '\n';
|
||||||
|
outs() << o->getFileName()
|
||||||
|
<< ":\tfile format " << o->getFileFormatName() << "\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
if (Disassemble)
|
if (Disassemble)
|
||||||
DisassembleObject(o, Relocations);
|
DisassembleObject(o, Relocations);
|
||||||
@ -1379,6 +1423,8 @@ static void DumpObject(const ObjectFile *o) {
|
|||||||
printLazyBindTable(o);
|
printLazyBindTable(o);
|
||||||
if (WeakBind)
|
if (WeakBind)
|
||||||
printWeakBindTable(o);
|
printWeakBindTable(o);
|
||||||
|
if (RawClangAST)
|
||||||
|
printRawClangAST(o);
|
||||||
if (PrintFaultMaps)
|
if (PrintFaultMaps)
|
||||||
printFaultMaps(o);
|
printFaultMaps(o);
|
||||||
}
|
}
|
||||||
@ -1469,6 +1515,7 @@ int main(int argc, char **argv) {
|
|||||||
&& !Bind
|
&& !Bind
|
||||||
&& !LazyBind
|
&& !LazyBind
|
||||||
&& !WeakBind
|
&& !WeakBind
|
||||||
|
&& !RawClangAST
|
||||||
&& !(UniversalHeaders && MachOOpt)
|
&& !(UniversalHeaders && MachOOpt)
|
||||||
&& !(ArchiveHeaders && MachOOpt)
|
&& !(ArchiveHeaders && MachOOpt)
|
||||||
&& !(IndirectSymbols && MachOOpt)
|
&& !(IndirectSymbols && MachOOpt)
|
||||||
|
@ -26,7 +26,6 @@ extern cl::opt<std::string> ArchName;
|
|||||||
extern cl::opt<std::string> MCPU;
|
extern cl::opt<std::string> MCPU;
|
||||||
extern cl::list<std::string> MAttrs;
|
extern cl::list<std::string> MAttrs;
|
||||||
extern cl::list<std::string> DumpSections;
|
extern cl::list<std::string> DumpSections;
|
||||||
extern cl::opt<bool> Raw;
|
|
||||||
extern cl::opt<bool> Disassemble;
|
extern cl::opt<bool> Disassemble;
|
||||||
extern cl::opt<bool> NoShowRawInsn;
|
extern cl::opt<bool> NoShowRawInsn;
|
||||||
extern cl::opt<bool> PrivateHeaders;
|
extern cl::opt<bool> PrivateHeaders;
|
||||||
@ -35,6 +34,7 @@ extern cl::opt<bool> Rebase;
|
|||||||
extern cl::opt<bool> Bind;
|
extern cl::opt<bool> Bind;
|
||||||
extern cl::opt<bool> LazyBind;
|
extern cl::opt<bool> LazyBind;
|
||||||
extern cl::opt<bool> WeakBind;
|
extern cl::opt<bool> WeakBind;
|
||||||
|
extern cl::opt<bool> RawClangAST;
|
||||||
extern cl::opt<bool> UniversalHeaders;
|
extern cl::opt<bool> UniversalHeaders;
|
||||||
extern cl::opt<bool> ArchiveHeaders;
|
extern cl::opt<bool> ArchiveHeaders;
|
||||||
extern cl::opt<bool> IndirectSymbols;
|
extern cl::opt<bool> IndirectSymbols;
|
||||||
@ -72,6 +72,7 @@ void printRebaseTable(const object::ObjectFile *o);
|
|||||||
void printBindTable(const object::ObjectFile *o);
|
void printBindTable(const object::ObjectFile *o);
|
||||||
void printLazyBindTable(const object::ObjectFile *o);
|
void printLazyBindTable(const object::ObjectFile *o);
|
||||||
void printWeakBindTable(const object::ObjectFile *o);
|
void printWeakBindTable(const object::ObjectFile *o);
|
||||||
|
void printRawClangAST(const object::ObjectFile *o);
|
||||||
void PrintRelocations(const object::ObjectFile *o);
|
void PrintRelocations(const object::ObjectFile *o);
|
||||||
void PrintSectionHeaders(const object::ObjectFile *o);
|
void PrintSectionHeaders(const object::ObjectFile *o);
|
||||||
void PrintSectionContents(const object::ObjectFile *o);
|
void PrintSectionContents(const object::ObjectFile *o);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user