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:
Adrian Prantl
2015-07-08 02:04:15 +00:00
parent 7bcdaa6978
commit 54a2768153
4 changed files with 53 additions and 16 deletions

View File

@ -96,6 +96,10 @@ llvm::LazyBind("lazy-bind", cl::desc("Display mach-o lazy binding info"));
cl::opt<bool>
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>
MachOOpt("macho", cl::desc("Use MachO specific object file parser"));
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) {
const char *FaultMapSectionName = nullptr;
@ -1351,9 +1392,12 @@ static void printPrivateFileHeader(const ObjectFile *o) {
}
static void DumpObject(const ObjectFile *o) {
outs() << '\n';
outs() << o->getFileName()
<< ":\tfile format " << o->getFileFormatName() << "\n\n";
// Avoid other output when using a raw option.
if (!RawClangAST) {
outs() << '\n';
outs() << o->getFileName()
<< ":\tfile format " << o->getFileFormatName() << "\n\n";
}
if (Disassemble)
DisassembleObject(o, Relocations);
@ -1379,6 +1423,8 @@ static void DumpObject(const ObjectFile *o) {
printLazyBindTable(o);
if (WeakBind)
printWeakBindTable(o);
if (RawClangAST)
printRawClangAST(o);
if (PrintFaultMaps)
printFaultMaps(o);
}
@ -1469,6 +1515,7 @@ int main(int argc, char **argv) {
&& !Bind
&& !LazyBind
&& !WeakBind
&& !RawClangAST
&& !(UniversalHeaders && MachOOpt)
&& !(ArchiveHeaders && MachOOpt)
&& !(IndirectSymbols && MachOOpt)