[llvm-commits] [dragonegg] r90234 - in /dragonegg/trunk: llvm-convert.cpp llvm-internal.h

Duncan Sands baldrick at free.fr
Tue Dec 1 06:34:48 PST 2009


Author: baldrick
Date: Tue Dec  1 08:34:48 2009
New Revision: 90234

URL: http://llvm.org/viewvc/llvm-project?rev=90234&view=rev
Log:
Duplicate "Emit", with the second copy being for emitting gimple
assign with a single RHS.  In fact most of the emit logic is only
live in this case, so this is preparatory to horribly hacking on
the original "Emit".

Modified:
    dragonegg/trunk/llvm-convert.cpp
    dragonegg/trunk/llvm-internal.h

Modified: dragonegg/trunk/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=90234&r1=90233&r2=90234&view=diff

==============================================================================
--- dragonegg/trunk/llvm-convert.cpp (original)
+++ dragonegg/trunk/llvm-convert.cpp Tue Dec  1 08:34:48 2009
@@ -2256,9 +2256,63 @@
   return C;
 }
 
+Value *TreeToLLVM::EmitGimpleAssignSingleRHS(tree rhs, const MemRef *DestLoc) {
+  assert((AGGREGATE_TYPE_P(TREE_TYPE(rhs)) == (DestLoc != 0)) &&
+         "DestLoc for aggregate types only!");
+
+  Value *Result = 0;
+
+  switch (TREE_CODE(rhs)) {
+  default: Result = EmitGimpleReg(rhs); break;
+
+  // Exception handling.
+//FIXME  case EXC_PTR_EXPR:   Result = EmitEXC_PTR_EXPR(rhs); break;
+//FIXME  case FILTER_EXPR:    Result = EmitFILTER_EXPR(rhs); break;
+
+  // References (tcc_reference).
+  case ARRAY_REF:
+  case ARRAY_RANGE_REF:
+  case BIT_FIELD_REF:
+  case COMPONENT_REF:
+  case IMAGPART_EXPR:
+  case INDIRECT_REF:
+  case REALPART_EXPR:
+  case VIEW_CONVERT_EXPR:
+    Result = EmitLoadOfLValue(rhs, DestLoc);
+    break;
+
+  // Declarations (tcc_declaration).
+  case PARM_DECL:
+  case RESULT_DECL:
+  case VAR_DECL:
+    Result = EmitLoadOfLValue(rhs, DestLoc);
+    break;
+
+  // Constants (tcc_constant).
+  case STRING_CST:
+    Result = EmitLoadOfLValue(rhs, DestLoc);
+    break;
+
+  // Expressions (tcc_expression).
+  case ADDR_EXPR:    Result = EmitADDR_EXPR(rhs); break;
+  case OBJ_TYPE_REF: Result = EmitOBJ_TYPE_REF(rhs); break;
+
+  // Exceptional (tcc_exceptional).
+  case CONSTRUCTOR: Result = EmitCONSTRUCTOR(rhs, DestLoc); break;
+  }
+
+  assert(((DestLoc && Result == 0) || DestLoc == 0) &&
+         "Expected a scalar or aggregate but got the wrong thing!");
+
+  // Check that the type of the result matches that of the tree node.
+  assert((Result == 0 || Result->getType() == ConvertType(TREE_TYPE(rhs))) &&
+          "Value has wrong type!");
+  return Result;
+}
+
 Value *TreeToLLVM::EmitGimpleAssignRHS(gimple stmt, const MemRef *DestLoc) {
   if (get_gimple_rhs_class(gimple_expr_code(stmt)) == GIMPLE_SINGLE_RHS)
-    return Emit(gimple_assign_rhs1 (stmt), DestLoc);
+    return EmitGimpleAssignSingleRHS(gimple_assign_rhs1 (stmt), DestLoc);
 
   tree type = TREE_TYPE(gimple_assign_lhs(stmt));
   tree_code code = gimple_assign_rhs_code(stmt);

Modified: dragonegg/trunk/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=90234&r1=90233&r2=90234&view=diff

==============================================================================
--- dragonegg/trunk/llvm-internal.h (original)
+++ dragonegg/trunk/llvm-internal.h Tue Dec  1 08:34:48 2009
@@ -626,6 +626,7 @@
   // characteristics.
 
   // Expressions.
+  Value *EmitGimpleAssignSingleRHS(tree_node *rhs, const MemRef *DestLoc);
   Value *EmitGimpleAssignRHS(gimple stmt, const MemRef *DestLoc);
   Value *EmitGimpleCallRHS(gimple stmt, const MemRef *DestLoc);
   Value *EmitLoadOfLValue(tree_node *exp, const MemRef *DestLoc);





More information about the llvm-commits mailing list