[cfe-commits] r39540 - in /cfe/cfe/trunk/CodeGen: CGExpr.cpp CGStmt.cpp CodeGenFunction.cpp

clattner at cs.uiuc.edu clattner at cs.uiuc.edu
Wed Jul 11 09:45:24 PDT 2007


Author: clattner
Date: Wed Jul 11 11:45:24 2007
New Revision: 39540

URL: http://llvm.org/viewvc/llvm-project?rev=39540&view=rev
Log:
split stmt/expr codegen into their own files.

Added:
    cfe/cfe/trunk/CodeGen/CGExpr.cpp   (with props)
    cfe/cfe/trunk/CodeGen/CGStmt.cpp   (with props)
Modified:
    cfe/cfe/trunk/CodeGen/CodeGenFunction.cpp

Added: cfe/cfe/trunk/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/CodeGen/CGExpr.cpp?rev=39540&view=auto

==============================================================================
--- cfe/cfe/trunk/CodeGen/CGExpr.cpp (added)
+++ cfe/cfe/trunk/CodeGen/CGExpr.cpp Wed Jul 11 11:45:24 2007
@@ -0,0 +1,47 @@
+//===--- CGExpr.cpp - Emit LLVM Code from Expressions ---------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by Chris Lattner and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This contains code to emit Expr nodes as LLVM code.
+//
+//===----------------------------------------------------------------------===//
+
+#include "CodeGenFunction.h"
+#include "clang/AST/AST.h"
+#include "llvm/Constants.h"
+#include "llvm/DerivedTypes.h"
+using namespace llvm;
+using namespace clang;
+using namespace CodeGen;
+
+
+//===--------------------------------------------------------------------===//
+//                             Expression Emission
+//===--------------------------------------------------------------------===//
+
+ExprResult CodeGenFunction::EmitExpr(const Expr *E) {
+  assert(E && "Null expression?");
+  
+  switch (E->getStmtClass()) {
+  default:
+    printf("Unimplemented expr!\n");
+    E->dump();
+    return ExprResult::get(UndefValue::get(llvm::Type::Int32Ty));
+  case Stmt::ParenExprClass:
+    return EmitExpr(cast<ParenExpr>(E)->getSubExpr());
+  case Stmt::IntegerLiteralClass:
+    return EmitIntegerLiteral(cast<IntegerLiteral>(E)); 
+  }
+  
+}
+
+ExprResult CodeGenFunction::EmitIntegerLiteral(const IntegerLiteral *E) {
+  return ExprResult::get(ConstantInt::get(E->getValue()));
+}
+
+

Propchange: cfe/cfe/trunk/CodeGen/CGExpr.cpp

------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cfe/cfe/trunk/CodeGen/CGExpr.cpp

------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: cfe/cfe/trunk/CodeGen/CGStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/CodeGen/CGStmt.cpp?rev=39540&view=auto

==============================================================================
--- cfe/cfe/trunk/CodeGen/CGStmt.cpp (added)
+++ cfe/cfe/trunk/CodeGen/CGStmt.cpp Wed Jul 11 11:45:24 2007
@@ -0,0 +1,180 @@
+//===--- CGStmt.cpp - Emit LLVM Code from Statements ----------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by Chris Lattner and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This contains code to emit Stmt nodes as LLVM code.
+//
+//===----------------------------------------------------------------------===//
+
+#include "CodeGenFunction.h"
+#include "clang/AST/AST.h"
+#include "llvm/Constants.h"
+#include "llvm/DerivedTypes.h"
+#include "llvm/Function.h"
+using namespace llvm;
+using namespace clang;
+using namespace CodeGen;
+
+//===----------------------------------------------------------------------===//
+//                              Statement Emission
+//===----------------------------------------------------------------------===//
+
+void CodeGenFunction::EmitStmt(const Stmt *S) {
+  assert(S && "Null statement?");
+  
+  switch (S->getStmtClass()) {
+  default:
+    // Must be an expression in a stmt context.  Emit the value and ignore the
+    // result.
+    if (const Expr *E = dyn_cast<Expr>(S)) {
+      EmitExpr(E);
+    } else {
+      printf("Unimplemented stmt!\n");
+      S->dump();
+    }
+    break;
+  case Stmt::NullStmtClass: break;
+  case Stmt::CompoundStmtClass: EmitCompoundStmt(cast<CompoundStmt>(*S)); break;
+  case Stmt::LabelStmtClass:    EmitLabelStmt(cast<LabelStmt>(*S));       break;
+  case Stmt::GotoStmtClass:     EmitGotoStmt(cast<GotoStmt>(*S));         break;
+  case Stmt::IfStmtClass:       EmitIfStmt(cast<IfStmt>(*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);
+}
+
+void CodeGenFunction::EmitBlock(BasicBlock *BB) {
+  // Emit a branch from this block to the next one if this was a real block.  If
+  // this was just a fall-through block after a terminator, don't emit it.
+  BasicBlock *LastBB = Builder.GetInsertBlock();
+  
+  if (LastBB->getTerminator()) {
+    // If the previous block is already terminated, don't touch it.
+  } else if (LastBB->empty() && LastBB->getValueName() == 0) {
+    // If the last block was an empty placeholder, remove it now.
+    // TODO: cache and reuse these.
+    Builder.GetInsertBlock()->eraseFromParent();
+  } else {
+    // Otherwise, create a fall-through branch.
+    Builder.CreateBr(BB);
+  }
+  CurFn->getBasicBlockList().push_back(BB);
+  Builder.SetInsertPoint(BB);
+}
+
+void CodeGenFunction::EmitLabelStmt(const LabelStmt &S) {
+  llvm::BasicBlock *NextBB = getBasicBlockForLabel(&S);
+  
+  EmitBlock(NextBB);
+  EmitStmt(S.getSubStmt());
+}
+
+void CodeGenFunction::EmitGotoStmt(const GotoStmt &S) {
+  Builder.CreateBr(getBasicBlockForLabel(S.getLabel()));
+  
+  // Emit a block after the branch so that dead code after a goto has some place
+  // to go.
+  Builder.SetInsertPoint(new BasicBlock("", CurFn));
+}
+
+void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
+  // Emit the if condition.
+  ExprResult CondVal = EmitExpr(S.getCond());
+  QualType CondTy = S.getCond()->getType().getCanonicalType();
+  
+  // C99 6.8.4.1: The first substatement is executed if the expression compares
+  // unequal to 0.  The condition must be a scalar type.
+  llvm::Value *BoolCondVal;
+  
+  // MOVE this to a helper method, to share with for/while, assign to bool, etc.
+  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CondTy)) {
+    switch (BT->getKind()) {
+    default: assert(0 && "Unknown scalar value");
+    case BuiltinType::Bool:
+      BoolCondVal = CondVal.getVal();
+      // Bool is already evaluated right.
+      assert(BoolCondVal->getType() == llvm::Type::Int1Ty &&
+             "Unexpected bool value type!");
+      break;
+    case BuiltinType::Char:
+    case BuiltinType::SChar:
+    case BuiltinType::UChar:
+    case BuiltinType::Int:
+    case BuiltinType::UInt:
+    case BuiltinType::Long:
+    case BuiltinType::ULong:
+    case BuiltinType::LongLong:
+    case BuiltinType::ULongLong: {
+      // Compare against zero for integers.
+      BoolCondVal = CondVal.getVal();
+      llvm::Value *Zero = Constant::getNullValue(BoolCondVal->getType());
+      BoolCondVal = Builder.CreateICmpNE(BoolCondVal, Zero);
+      break;
+    }
+    case BuiltinType::Float:
+    case BuiltinType::Double:
+    case BuiltinType::LongDouble: {
+      // Compare against 0.0 for fp scalars.
+      BoolCondVal = CondVal.getVal();
+      llvm::Value *Zero = Constant::getNullValue(BoolCondVal->getType());
+      // FIXME: llvm-gcc produces a une comparison: validate this is right.
+      BoolCondVal = Builder.CreateFCmpUNE(BoolCondVal, Zero);
+      break;
+    }
+      
+    case BuiltinType::FloatComplex:
+    case BuiltinType::DoubleComplex:
+    case BuiltinType::LongDoubleComplex:
+      assert(0 && "comparisons against complex not implemented yet");
+    }
+  } else if (isa<PointerType>(CondTy)) {
+    BoolCondVal = CondVal.getVal();
+    llvm::Value *NullPtr = Constant::getNullValue(BoolCondVal->getType());
+    BoolCondVal = Builder.CreateICmpNE(BoolCondVal, NullPtr);
+    
+  } else {
+    const TagType *TT = cast<TagType>(CondTy);
+    assert(TT->getDecl()->getKind() == Decl::Enum && "Unknown scalar type");
+    // Compare against zero.
+    BoolCondVal = CondVal.getVal();
+    llvm::Value *Zero = Constant::getNullValue(BoolCondVal->getType());
+    BoolCondVal = Builder.CreateICmpNE(BoolCondVal, Zero);
+  }
+  
+  BasicBlock *ContBlock = new BasicBlock("ifend");
+  BasicBlock *ThenBlock = new BasicBlock("ifthen");
+  BasicBlock *ElseBlock = ContBlock;
+  
+  if (S.getElse())
+    ElseBlock = new BasicBlock("ifelse");
+  
+  // Insert the conditional branch.
+  Builder.CreateCondBr(BoolCondVal, ThenBlock, ElseBlock);
+  
+  // Emit the 'then' code.
+  EmitBlock(ThenBlock);
+  EmitStmt(S.getThen());
+  Builder.CreateBr(ContBlock);
+  
+  // Emit the 'else' code if present.
+  if (const Stmt *Else = S.getElse()) {
+    EmitBlock(ElseBlock);
+    EmitStmt(Else);
+    Builder.CreateBr(ContBlock);
+  }
+  
+  // Emit the continuation block for code after the if.
+  EmitBlock(ContBlock);
+}
+

Propchange: cfe/cfe/trunk/CodeGen/CGStmt.cpp

------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cfe/cfe/trunk/CodeGen/CGStmt.cpp

------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: cfe/cfe/trunk/CodeGen/CodeGenFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/CodeGen/CodeGenFunction.cpp?rev=39540&r1=39539&r2=39540&view=diff

==============================================================================
--- cfe/cfe/trunk/CodeGen/CodeGenFunction.cpp (original)
+++ cfe/cfe/trunk/CodeGen/CodeGenFunction.cpp Wed Jul 11 11:45:24 2007
@@ -135,188 +135,3 @@
   assert(!verifyFunction(*CurFn));
 }
 
-
-//===----------------------------------------------------------------------===//
-//                              Statement Emission
-//===----------------------------------------------------------------------===//
-
-void CodeGenFunction::EmitStmt(const Stmt *S) {
-  assert(S && "Null statement?");
-  
-  switch (S->getStmtClass()) {
-  default:
-    // Must be an expression in a stmt context.  Emit the value and ignore the
-    // result.
-    if (const Expr *E = dyn_cast<Expr>(S)) {
-      EmitExpr(E);
-    } else {
-      printf("Unimplemented stmt!\n");
-      S->dump();
-    }
-    break;
-  case Stmt::NullStmtClass: break;
-  case Stmt::CompoundStmtClass: EmitCompoundStmt(cast<CompoundStmt>(*S)); break;
-  case Stmt::LabelStmtClass:    EmitLabelStmt(cast<LabelStmt>(*S));       break;
-  case Stmt::GotoStmtClass:     EmitGotoStmt(cast<GotoStmt>(*S));         break;
-  case Stmt::IfStmtClass:       EmitIfStmt(cast<IfStmt>(*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);
-}
-
-void CodeGenFunction::EmitBlock(BasicBlock *BB) {
-  // Emit a branch from this block to the next one if this was a real block.  If
-  // this was just a fall-through block after a terminator, don't emit it.
-  BasicBlock *LastBB = Builder.GetInsertBlock();
-  
-  if (LastBB->getTerminator()) {
-    // If the previous block is already terminated, don't touch it.
-  } else if (LastBB->empty() && LastBB->getValueName() == 0) {
-    // If the last block was an empty placeholder, remove it now.
-    // TODO: cache and reuse these.
-    Builder.GetInsertBlock()->eraseFromParent();
-  } else {
-    // Otherwise, create a fall-through branch.
-    Builder.CreateBr(BB);
-  }
-  CurFn->getBasicBlockList().push_back(BB);
-  Builder.SetInsertPoint(BB);
-}
-
-void CodeGenFunction::EmitLabelStmt(const LabelStmt &S) {
-  llvm::BasicBlock *NextBB = getBasicBlockForLabel(&S);
-  
-  EmitBlock(NextBB);
-  EmitStmt(S.getSubStmt());
-}
-
-void CodeGenFunction::EmitGotoStmt(const GotoStmt &S) {
-  Builder.CreateBr(getBasicBlockForLabel(S.getLabel()));
-  
-  // Emit a block after the branch so that dead code after a goto has some place
-  // to go.
-  Builder.SetInsertPoint(new BasicBlock("", CurFn));
-}
-
-void CodeGenFunction::EmitIfStmt(const IfStmt &S) {
-  // Emit the if condition.
-  ExprResult CondVal = EmitExpr(S.getCond());
-  QualType CondTy = S.getCond()->getType().getCanonicalType();
-  
-  // C99 6.8.4.1: The first substatement is executed if the expression compares
-  // unequal to 0.  The condition must be a scalar type.
-  llvm::Value *BoolCondVal;
-  
-  // MOVE this to a helper method, to share with for/while, assign to bool, etc.
-  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CondTy)) {
-    switch (BT->getKind()) {
-    default: assert(0 && "Unknown scalar value");
-    case BuiltinType::Bool:
-      BoolCondVal = CondVal.getVal();
-      // Bool is already evaluated right.
-      assert(BoolCondVal->getType() == llvm::Type::Int1Ty &&
-             "Unexpected bool value type!");
-      break;
-    case BuiltinType::Char:
-    case BuiltinType::SChar:
-    case BuiltinType::UChar:
-    case BuiltinType::Int:
-    case BuiltinType::UInt:
-    case BuiltinType::Long:
-    case BuiltinType::ULong:
-    case BuiltinType::LongLong:
-    case BuiltinType::ULongLong: {
-      // Compare against zero for integers.
-      BoolCondVal = CondVal.getVal();
-      llvm::Value *Zero = Constant::getNullValue(BoolCondVal->getType());
-      BoolCondVal = Builder.CreateICmpNE(BoolCondVal, Zero);
-      break;
-    }
-    case BuiltinType::Float:
-    case BuiltinType::Double:
-    case BuiltinType::LongDouble: {
-      // Compare against 0.0 for fp scalars.
-      BoolCondVal = CondVal.getVal();
-      llvm::Value *Zero = Constant::getNullValue(BoolCondVal->getType());
-      // FIXME: llvm-gcc produces a une comparison: validate this is right.
-      BoolCondVal = Builder.CreateFCmpUNE(BoolCondVal, Zero);
-      break;
-    }
-      
-    case BuiltinType::FloatComplex:
-    case BuiltinType::DoubleComplex:
-    case BuiltinType::LongDoubleComplex:
-      assert(0 && "comparisons against complex not implemented yet");
-    }
-  } else if (isa<PointerType>(CondTy)) {
-    BoolCondVal = CondVal.getVal();
-    llvm::Value *NullPtr = Constant::getNullValue(BoolCondVal->getType());
-    BoolCondVal = Builder.CreateICmpNE(BoolCondVal, NullPtr);
-    
-  } else {
-    const TagType *TT = cast<TagType>(CondTy);
-    assert(TT->getDecl()->getKind() == Decl::Enum && "Unknown scalar type");
-    // Compare against zero.
-    BoolCondVal = CondVal.getVal();
-    llvm::Value *Zero = Constant::getNullValue(BoolCondVal->getType());
-    BoolCondVal = Builder.CreateICmpNE(BoolCondVal, Zero);
-  }
-  
-  BasicBlock *ContBlock = new BasicBlock("ifend");
-  BasicBlock *ThenBlock = new BasicBlock("ifthen");
-  BasicBlock *ElseBlock = ContBlock;
-  
-  if (S.getElse())
-    ElseBlock = new BasicBlock("ifelse");
-  
-  // Insert the conditional branch.
-  Builder.CreateCondBr(BoolCondVal, ThenBlock, ElseBlock);
-  
-  // Emit the 'then' code.
-  EmitBlock(ThenBlock);
-  EmitStmt(S.getThen());
-  Builder.CreateBr(ContBlock);
-  
-  // Emit the 'else' code if present.
-  if (const Stmt *Else = S.getElse()) {
-    EmitBlock(ElseBlock);
-    EmitStmt(Else);
-    Builder.CreateBr(ContBlock);
-  }
-  
-  // Emit the continuation block for code after the if.
-  EmitBlock(ContBlock);
-}
-
-
-//===--------------------------------------------------------------------===//
-//                             Expression Emission
-//===--------------------------------------------------------------------===//
-
-ExprResult CodeGenFunction::EmitExpr(const Expr *E) {
-  assert(E && "Null expression?");
-  
-  switch (E->getStmtClass()) {
-  default:
-    printf("Unimplemented expr!\n");
-    E->dump();
-    return ExprResult::get(UndefValue::get(llvm::Type::Int32Ty));
-  case Stmt::ParenExprClass:
-    return EmitExpr(cast<ParenExpr>(E)->getSubExpr());
-  case Stmt::IntegerLiteralClass:
-    return EmitIntegerLiteral(cast<IntegerLiteral>(E)); 
-  }
-  
-}
-
-ExprResult CodeGenFunction::EmitIntegerLiteral(const IntegerLiteral *E) {
-  return ExprResult::get(ConstantInt::get(E->getValue()));
-}
-
-





More information about the cfe-commits mailing list