[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