Skip to content
Snippets Groups Projects
Commit 6dad790d authored by Sean Callanan's avatar Sean Callanan
Browse files

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 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


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@310318 91177308-0d34-0410-b5e6-96231b3b80d8
parent 82579b76
No related branches found
No related tags found
No related merge requests found
struct Bar {
void bar(int _a, bool _b) {
{
struct S { int a; };
S s = { _a };
}
{
struct S { bool b; };
S t = { _b };
}
};
};
// 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);
}
struct S {
int a;
};
struct Bar {
void bar(int _a) {
S s = { _a };
};
};
// 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);
}
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment