Add codegen support for NullStmt and CompoundStmt.  {;;{};;} is now ours!

llvm-svn: 39522
diff --git a/clang/CodeGen/CodeGenFunction.cpp b/clang/CodeGen/CodeGenFunction.cpp
index cfe5d9d..ff31a83 100644
--- a/clang/CodeGen/CodeGenFunction.cpp
+++ b/clang/CodeGen/CodeGenFunction.cpp
@@ -16,7 +16,7 @@
 #include "clang/Basic/TargetInfo.h"
 #include "clang/AST/AST.h"
 #include "llvm/DerivedTypes.h"
-#include "llvm/Support/LLVMBuilder.h"
+#include "llvm/Function.h"
 using namespace llvm;
 using namespace clang;
 using namespace CodeGen;
@@ -101,9 +101,45 @@
 }
 
 
-void CodeGenFunction::GenerateCode(FunctionDecl *FD) {
+void CodeGenFunction::GenerateCode(const FunctionDecl *FD) {
   const llvm::Type *Ty = ConvertType(FD->getType(), FD->getLocation());
   
-  Ty->dump();
+  llvm::Function *F = new Function(cast<llvm::FunctionType>(Ty),
+                                   Function::ExternalLinkage,
+                                   FD->getName(), &CGM.getModule());
   
+  BasicBlock *EntryBB = new BasicBlock("entry", F);
+  
+  // TODO: Walk the decls, creating allocas etc.
+  
+  Builder.SetInsertPoint(EntryBB);
+  
+  EmitStmt(FD->getBody());
 }
+
+
+//===----------------------------------------------------------------------===//
+//                              Statement Emission
+//===----------------------------------------------------------------------===//
+
+void CodeGenFunction::EmitStmt(const Stmt *S) {
+  assert(S && "Null statement?");
+  
+  switch (S->getStmtClass()) {
+  default:
+    printf("Unimplemented stmt!\n");
+    S->dump();
+    break;
+  case Stmt::NullStmtClass: break;
+  case Stmt::CompoundStmtClass: EmitCompoundStmt(cast<CompoundStmt>(*S)); break;
+  }
+}
+
+void CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S) {
+  // FIXME: handle vla's etc.
+  
+  for (CompoundStmt::const_body_iterator I = S.body_begin(), E = S.body_end();
+       I != E; ++I)
+    EmitStmt(*I);
+}
+