This adds the argument --dump-ir to clang-import-test, which allows
authorSean Callanan <scallanan@apple.com>
Mon, 7 Aug 2017 22:27:30 +0000 (22:27 +0000)
committerSean Callanan <scallanan@apple.com>
Mon, 7 Aug 2017 22:27:30 +0000 (22:27 +0000)
viewing of the final IR. This is useful for confirming that
structure layout was correct.

I've added two tests:

- A test that checks that structs in top-level code are completed
  correctly during struct layout (they are)
- A test that checks that structs defined in function bodies are
  cpmpleted correctly during struct layout (currently they are not,
  so this is XFAIL).

The second test fails because LookupSameContext()
(ExternalASTMerger.cpp) can't find the struct. This is an issue I
intend to resolve separately.

Differential Revision: https://reviews.llvm.org/D36429

llvm-svn: 310318

clang/test/Import/local-struct/Inputs/Callee.cpp [new file with mode: 0644]
clang/test/Import/local-struct/test.cpp [new file with mode: 0644]
clang/test/Import/struct-layout/Inputs/Callee.cpp [new file with mode: 0644]
clang/test/Import/struct-layout/test.cpp [new file with mode: 0644]
clang/tools/clang-import-test/clang-import-test.cpp

diff --git a/clang/test/Import/local-struct/Inputs/Callee.cpp b/clang/test/Import/local-struct/Inputs/Callee.cpp
new file mode 100644 (file)
index 0000000..96cd2f2
--- /dev/null
@@ -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/clang/test/Import/local-struct/test.cpp b/clang/test/Import/local-struct/test.cpp
new file mode 100644 (file)
index 0000000..8f6e381
--- /dev/null
@@ -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/clang/test/Import/struct-layout/Inputs/Callee.cpp b/clang/test/Import/struct-layout/Inputs/Callee.cpp
new file mode 100644 (file)
index 0000000..62422af
--- /dev/null
@@ -0,0 +1,9 @@
+struct S {
+  int a;
+};
+
+struct Bar {
+  void bar(int _a) {
+    S s = { _a };
+  };
+};
diff --git a/clang/test/Import/struct-layout/test.cpp b/clang/test/Import/struct-layout/test.cpp
new file mode 100644 (file)
index 0000000..698d060
--- /dev/null
@@ -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);
+}
index 286cb05..186a7c8 100644 (file)
@@ -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);