diff --git a/test/Import/local-struct/Inputs/Callee.cpp b/test/Import/local-struct/Inputs/Callee.cpp new file mode 100644 index 0000000000000000000000000000000000000000..96cd2f22e49349a39abbf384a88fe479befa06dc --- /dev/null +++ b/test/Import/local-struct/Inputs/Callee.cpp @@ -0,0 +1,12 @@ +struct Bar { + void bar(int _a, bool _b) { + { + struct S { int a; }; + S s = { _a }; + } + { + struct S { bool b; }; + S t = { _b }; + } + }; +}; diff --git a/test/Import/local-struct/test.cpp b/test/Import/local-struct/test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8f6e38138f2e80766e2be99c8a328d3a069e1400 --- /dev/null +++ b/test/Import/local-struct/test.cpp @@ -0,0 +1,8 @@ +// RUN: clang-import-test -dump-ir -import %S/Inputs/Callee.cpp -expression %s | FileCheck %s +// XFAIL: * +// CHECK: %struct.S = type { i +// CHECK: %struct.S.0 = type { i1 } + +void foo() { + return Bar().bar(3, true); +} diff --git a/test/Import/struct-layout/Inputs/Callee.cpp b/test/Import/struct-layout/Inputs/Callee.cpp new file mode 100644 index 0000000000000000000000000000000000000000..62422af6c2dea367ee126a664eafe1efee91d10b --- /dev/null +++ b/test/Import/struct-layout/Inputs/Callee.cpp @@ -0,0 +1,9 @@ +struct S { + int a; +}; + +struct Bar { + void bar(int _a) { + S s = { _a }; + }; +}; diff --git a/test/Import/struct-layout/test.cpp b/test/Import/struct-layout/test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..698d0609fa0527372029b0a5a08afcc0b83e5b1f --- /dev/null +++ b/test/Import/struct-layout/test.cpp @@ -0,0 +1,6 @@ +// RUN: clang-import-test -dump-ir -import %S/Inputs/Callee.cpp -expression %s | FileCheck %s +// CHECK: %struct.S = type { i + +void foo() { + return Bar().bar(3); +} diff --git a/tools/clang-import-test/clang-import-test.cpp b/tools/clang-import-test/clang-import-test.cpp index 286cb05219c75e1b0fb453fe01733e367ba2c978..186a7c82dc1a4ca571f3120b9eb786ad959f2b9d 100644 --- a/tools/clang-import-test/clang-import-test.cpp +++ b/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 @@ static llvm::cl::opt<bool> 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::Error ParseSource(const std::string &Path, CompilerInstance &CI, 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 @@ Parse(const std::string &Path, 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,8 @@ Parse(const std::string &Path, 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 +317,7 @@ int main(int argc, const char **argv) { 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 +333,7 @@ int main(int argc, const char **argv) { } } 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);