[Lldb-commits] [PATCH] D40745: Add a clang-ast subcommand to lldb-test
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Tue Dec 5 09:44:37 PST 2017
Didn't someone recently submit a patch to allow relocation of .o files? That should have taken care of the issue, no?
> On Dec 4, 2017, at 5:01 AM, Pavel Labath via lldb-commits <lldb-commits at lists.llvm.org> wrote:
>
> The reason you hit the assert there, is because you're running lldb on
> an un-linked object file. When you link the file, the linker will
> resolve these relocations and they will disappear. This is also the
> reason you got those errors after removing the assert (you were
> trying to parse unrelocated dwarf). To run your tests, you'll need to
> run the object file through the linker (something like ld -shared -o
> foo.so foo.o should suffice)
>
> The fact that we crash there is certainly a bug, but the bug may be
> that we are even accepting these files in the first place. It might be
> interesting to make lldb read these files, if for nothing else, then
> for the sake of testing, but that is not a trivial task. Right now
> that relocating code is completely wrong (e.g. it assumes all
> relocations are x86 relocations).
>
> On 1 December 2017 at 20:49, Zachary Turner via Phabricator
> <reviews at reviews.llvm.org> wrote:
>> zturner created this revision.
>> Herald added a subscriber: emaste.
>>
>> This is the bare minimum needed to dump `ClangASTContext`s via `lldb-test`.
>>
>> Within the first 10 seconds of using this, I already found a bug. A `FIXME` note and repro is included in the comments in this patch.
>>
>> With this, it should be possible to do deep testing of otherwise difficult to test scenarios involving `ClangASTContext`.
>>
>>
>> https://reviews.llvm.org/D40745
>>
>> Files:
>> lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
>> lldb/tools/lldb-test/lldb-test.cpp
>>
>>
>> Index: lldb/tools/lldb-test/lldb-test.cpp
>> ===================================================================
>> --- lldb/tools/lldb-test/lldb-test.cpp
>> +++ lldb/tools/lldb-test/lldb-test.cpp
>> @@ -10,11 +10,15 @@
>> #include "FormatUtil.h"
>> #include "SystemInitializerTest.h"
>>
>> +#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
>> #include "lldb/Core/Debugger.h"
>> #include "lldb/Core/Module.h"
>> #include "lldb/Core/Section.h"
>> #include "lldb/Initialization/SystemLifetimeManager.h"
>> +#include "lldb/Symbol/ClangASTContext.h"
>> +#include "lldb/Symbol/ClangASTImporter.h"
>> #include "lldb/Utility/DataExtractor.h"
>> +#include "lldb/Utility/StreamString.h"
>>
>> #include "llvm/ADT/StringRef.h"
>> #include "llvm/Support/CommandLine.h"
>> @@ -30,26 +34,48 @@
>> namespace opts {
>> cl::SubCommand ModuleSubcommand("module-sections",
>> "Display LLDB Module Information");
>> +cl::SubCommand ClangASTSubcommand("clang-ast", "Dump Clang AST for input file");
>>
>> namespace module {
>> cl::opt<bool> SectionContents("contents",
>> cl::desc("Dump each section's contents"),
>> cl::sub(ModuleSubcommand));
>> cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<input files>"),
>> cl::OneOrMore, cl::sub(ModuleSubcommand));
>> } // namespace module
>> +
>> +namespace clang_ast {
>> +cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<input files>"),
>> + cl::OneOrMore,
>> + cl::sub(ClangASTSubcommand));
>> +}
>> } // namespace opts
>>
>> static llvm::ManagedStatic<SystemLifetimeManager> DebuggerLifetime;
>>
>> +static void dumpClangASTContext(Debugger &Dbg) {
>> + for (const auto &File : opts::clang_ast::InputFilenames) {
>> + ModuleSpec Spec{FileSpec(File, false)};
>> + Spec.GetSymbolFileSpec().SetFile(File, false);
>> +
>> + auto ModulePtr = std::make_shared<lldb_private::Module>(Spec);
>> +
>> + StreamString Stream;
>> + ModulePtr->ParseAllDebugSymbols();
>> + ModulePtr->Dump(&Stream);
>> + llvm::outs() << Stream.GetData() << "\n";
>> + llvm::outs().flush();
>> + }
>> +}
>> +
>> static void dumpModules(Debugger &Dbg) {
>> LinePrinter Printer(4, llvm::outs());
>>
>> for (const auto &File : opts::module::InputFilenames) {
>> ModuleSpec Spec{FileSpec(File, false)};
>> Spec.GetSymbolFileSpec().SetFile(File, false);
>>
>> - auto ModulePtr = std::make_shared<Module>(Spec);
>> + auto ModulePtr = std::make_shared<lldb_private::Module>(Spec);
>> SectionList *Sections = ModulePtr->GetSectionList();
>> if (!Sections) {
>> llvm::errs() << "Could not load sections for module " << File << "\n";
>> @@ -92,6 +118,8 @@
>>
>> if (opts::ModuleSubcommand)
>> dumpModules(*Dbg);
>> + else if (opts::ClangASTSubcommand)
>> + dumpClangASTContext(*Dbg);
>>
>> DebuggerLifetime->Terminate();
>> return 0;
>> Index: lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
>> ===================================================================
>> --- lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
>> +++ lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
>> @@ -2764,6 +2764,14 @@
>> case R_386_32:
>> case R_386_PC32:
>> default:
>> + // FIXME: This asserts with this input:
>> + //
>> + // foo.cpp
>> + // int main(int argc, char **argv) { return 0; }
>> + //
>> + // clang++.exe --target=i686-unknown-linux-gnu -g -c foo.cpp -o foo.o
>> + //
>> + // and running this on the foo.o module.
>> assert(false && "unexpected relocation type");
>> }
>> } else {
>>
>>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list