spyffe created this revision. This adds the argument `--dump-ir` to `clang-import-test`, which allows viewing of the final IR. This is useful for confirming that structure layout was correct.
I've added an XFAILed test that exercises this, checking that a struct defined inside a function body has the right fields. Currently it does not because `LookupSameContext()` (ExternalASTMerger.cpp) can't find the struct. This is an issue I intend to resolve separately. Repository: rL LLVM https://reviews.llvm.org/D36429 Files: test/Import/local-struct/Inputs/Callee.cpp test/Import/local-struct/test.cpp tools/clang-import-test/clang-import-test.cpp
Index: tools/clang-import-test/clang-import-test.cpp =================================================================== --- tools/clang-import-test/clang-import-test.cpp +++ tools/clang-import-test/clang-import-test.cpp @@ -27,6 +27,7 @@ #include "clang/Parse/ParseAST.h" #include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Error.h" #include "llvm/Support/Host.h" @@ -63,6 +64,10 @@ DumpAST("dump-ast", llvm::cl::init(false), llvm::cl::desc("Dump combined AST")); +static llvm::cl::opt<bool> +DumpIR("dump-ir", llvm::cl::init(false), + llvm::cl::desc("Dump IR from final parse")); + namespace init_convenience { class TestDiagnosticConsumer : public DiagnosticConsumer { private: @@ -264,7 +269,7 @@ llvm::Expected<std::unique_ptr<CompilerInstance>> Parse(const std::string &Path, llvm::ArrayRef<std::unique_ptr<CompilerInstance>> Imports, - bool ShouldDumpAST) { + bool ShouldDumpAST, bool ShouldDumpIR) { std::unique_ptr<CompilerInstance> CI = init_convenience::BuildCompilerInstance(); auto ST = llvm::make_unique<SelectorTable>(); @@ -279,6 +284,7 @@ auto LLVMCtx = llvm::make_unique<llvm::LLVMContext>(); ASTConsumers.push_back(init_convenience::BuildCodeGen(*CI, *LLVMCtx)); + auto &CG = *static_cast<CodeGenerator*>(ASTConsumers.back().get()); if (ShouldDumpAST) ASTConsumers.push_back(CreateASTDumper("", true, false, false)); @@ -292,6 +298,9 @@ return std::move(PE); } CI->getDiagnosticClient().EndSourceFile(); + if (ShouldDumpIR) { + CG.GetModule()->print(llvm::outs(), nullptr); + } if (CI->getDiagnosticClient().getNumErrors()) { return llvm::make_error<llvm::StringError>( "Errors occured while parsing the expression.", std::error_code()); @@ -309,7 +318,7 @@ std::vector<std::unique_ptr<CompilerInstance>> ImportCIs; for (auto I : Imports) { llvm::Expected<std::unique_ptr<CompilerInstance>> ImportCI = - Parse(I, {}, false); + Parse(I, {}, false, false); if (auto E = ImportCI.takeError()) { llvm::errs() << llvm::toString(std::move(E)); exit(-1); @@ -325,7 +334,7 @@ } } llvm::Expected<std::unique_ptr<CompilerInstance>> ExpressionCI = - Parse(Expression, Direct ? ImportCIs : IndirectCIs, DumpAST); + Parse(Expression, Direct ? ImportCIs : IndirectCIs, DumpAST, DumpIR); if (auto E = ExpressionCI.takeError()) { llvm::errs() << llvm::toString(std::move(E)); exit(-1); Index: test/Import/local-struct/test.cpp =================================================================== --- test/Import/local-struct/test.cpp +++ test/Import/local-struct/test.cpp @@ -1,7 +1,8 @@ -// RUN: clang-import-test -dump-ast -import %S/Inputs/Hierarchy.cpp -expression %s | FileCheck %s +// RUN: clang-import-test -dump-ir -import %S/Inputs/Callee.cpp -expression %s | FileCheck %s +// XFAIL: * +// CHECK: %struct.S = type { i32 } +// CHECK: %struct.S.0 = type { i8 } -// CHECK: Overrides:{{.*}}Base::foo - void foo() { - Derived d; + return Bar().bar(3, true); } Index: test/Import/local-struct/Inputs/Callee.cpp =================================================================== --- test/Import/local-struct/Inputs/Callee.cpp +++ test/Import/local-struct/Inputs/Callee.cpp @@ -1,9 +1,12 @@ -class Base { -public: - virtual void foo() {} +struct Bar { + void bar(int _a, bool _b) { + { + struct S { int a; }; + S s = { _a }; + } + { + struct S { bool b; }; + S t = { _b }; + } + }; }; - -class Derived : public Base { -public: - void foo() override {} -};
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits