[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dotgnu-pnet-commits] pnet ChangeLog codegen/cg_cast.tc codegen/cg_co...
From: |
Klaus Treichel |
Subject: |
[dotgnu-pnet-commits] pnet ChangeLog codegen/cg_cast.tc codegen/cg_co... |
Date: |
Tue, 23 Dec 2008 13:31:15 +0000 |
CVSROOT: /cvsroot/dotgnu-pnet
Module name: pnet
Changes by: Klaus Treichel <ktreichel> 08/12/23 13:31:15
Modified files:
. : ChangeLog
codegen : cg_cast.tc cg_coerce.c cg_decls.tc
cscc/csharp : cs_stmt.tc
include : il_types.h
Log message:
Create pinned locals for the expressions in a fixed statement in cscc.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pnet/ChangeLog?cvsroot=dotgnu-pnet&r1=1.3593&r2=1.3594
http://cvs.savannah.gnu.org/viewcvs/pnet/codegen/cg_cast.tc?cvsroot=dotgnu-pnet&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/pnet/codegen/cg_coerce.c?cvsroot=dotgnu-pnet&r1=1.31&r2=1.32
http://cvs.savannah.gnu.org/viewcvs/pnet/codegen/cg_decls.tc?cvsroot=dotgnu-pnet&r1=1.60&r2=1.61
http://cvs.savannah.gnu.org/viewcvs/pnet/cscc/csharp/cs_stmt.tc?cvsroot=dotgnu-pnet&r1=1.44&r2=1.45
http://cvs.savannah.gnu.org/viewcvs/pnet/include/il_types.h?cvsroot=dotgnu-pnet&r1=1.30&r2=1.31
Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/ChangeLog,v
retrieving revision 1.3593
retrieving revision 1.3594
diff -u -b -r1.3593 -r1.3594
--- ChangeLog 21 Dec 2008 18:50:07 -0000 1.3593
+++ ChangeLog 23 Dec 2008 13:31:14 -0000 1.3594
@@ -1,3 +1,20 @@
+2008-12-23 Klaus Treichel <address@hidden>
+
+ * codegen/cg_cast.tc: Allow cast from managed pointer to unmanaged
+ pointer and vice versa.
+
+ * codegen/cg_coerce.c (GetUnsafeConvertRules): Allow cast from managed
+ pointer to umpanaged pointer in a fixed statement for the address of
+ operator.
+
+ * codegen/cg_decls.tc (DumpILLocals): Dump locals including prefixes.
+
+ * cscc/csharp/cs_stmt.tc: Create a pinned local for the expressions in
+ fixed expression and fixed address.
+
+ * include/il_types.h: Add macro ILType_IsRef to check for managed
+ pointers.
+
2008-12-21 Klaus Treichel <address@hidden>
* cscc/csharp/cs_stmt.tc (ILNode_SemAnalysis(ILNode_FixExpr)): Remove
the
Index: codegen/cg_cast.tc
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/codegen/cg_cast.tc,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- codegen/cg_cast.tc 9 Dec 2008 21:18:20 -0000 1.15
+++ codegen/cg_cast.tc 23 Dec 2008 13:31:14 -0000 1.16
@@ -1652,6 +1652,11 @@
{
ILGenSimple(info, IL_OP_CONV_U);
}
+ILGenCast(ILMachineType_ManagedPtr, ILMachineType_UnmanagedPtr),
+ILGenCast(ILMachineType_UnmanagedPtr, ILMachineType_ManagedPtr)
+{
+ /* Nothing to do here */
+}
ILGenCast(ILMachineType, ILMachineType_ObjectRef),
ILGenCast(ILMachineType, ILMachineType_UnmanagedPtr),
ILGenCast(ILMachineType, ILMachineType_ManagedPtr),
Index: codegen/cg_coerce.c
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/codegen/cg_coerce.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -b -r1.31 -r1.32
--- codegen/cg_coerce.c 14 Dec 2008 15:20:00 -0000 1.31
+++ codegen/cg_coerce.c 23 Dec 2008 13:31:14 -0000 1.32
@@ -440,6 +440,21 @@
}
}
}
+
+ /* Managed Pointer to pointer conversion */
+ if(ILType_IsPointer(toType) && ILType_IsRef(fromType))
+ {
+ if(ILType_Ref(toType) == ILType_Void)
+ {
+ /* We can allways cast to void * */
+ return 1;
+ }
+
+ if(ILTypeIdentical(ILType_Ref(fromType),
ILType_Ref(toType)))
+ {
+ return 1;
+ }
+ }
}
/* Could not find an appropriate conversion */
Index: codegen/cg_decls.tc
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/codegen/cg_decls.tc,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -b -r1.60 -r1.61
--- codegen/cg_decls.tc 26 Nov 2008 20:15:17 -0000 1.60
+++ codegen/cg_decls.tc 23 Dec 2008 13:31:14 -0000 1.61
@@ -614,7 +614,7 @@
fputs(", ", outstream);
}
ILDumpType(outstream, info->image,
- ILTypeGetLocal(localVarSig, index),
+
ILTypeGetLocalWithPrefixes(localVarSig, index),
IL_DUMP_QUOTE_NAMES);
}
fputs(")\n", outstream);
Index: cscc/csharp/cs_stmt.tc
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/cscc/csharp/cs_stmt.tc,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -b -r1.44 -r1.45
--- cscc/csharp/cs_stmt.tc 21 Dec 2008 18:50:15 -0000 1.44
+++ cscc/csharp/cs_stmt.tc 23 Dec 2008 13:31:15 -0000 1.45
@@ -152,6 +152,93 @@
}
}
+static ILNode *HandleFixedExpr(ILGenInfo *info, ILNode *nameNode,
+ ILNode *exprNode,
ILNode **exprParent,
+ int isFixAddress)
+{
+ CSSemValue value;
+ ILNode *expr;
+
+ /* Perform semantic analysis on the expression */
+ value = ILNode_SemAnalysis(exprNode, info, exprParent);
+
+ /* Assign the value to a pinned local. */
+ if(CSSemIsValue(value))
+ {
+ ILNode *pinnedVar;
+ unsigned long tempVar;
+ ILNode_MethodDeclaration *method;
+ ILType *pinnedType;
+ ILType *type = CSSemGetType(value);
+
+ /* Locate the method that this local is declared within */
+ method = (ILNode_MethodDeclaration *)(info->currentMethod);
+
+ expr = *exprParent;
+
+ if(isFixAddress && ILType_IsPointer(type))
+ {
+ type = ILTypeCreateRef(info->context,
IL_TYPE_COMPLEX_BYREF,
+
ILType_Ref(type));
+
+ if(!type)
+ {
+ CCOutOfMemory();
+ }
+ CSSemSetValueKind(value, CSSemGetKind(value), type);
+ }
+
+ /* Create the local variable signature for this method */
+ if(!(method->localVarSig))
+ {
+ method->localVarSig =
ILTypeCreateLocalList(info->context);
+ if(!(method->localVarSig))
+ {
+ CCOutOfMemory();
+ }
+ }
+
+ pinnedType = ILTypeCreateRef(info->context,
IL_TYPE_COMPLEX_PINNED,
+ type);
+ if(!pinnedType)
+ {
+ ILGenOutOfMemory(info);
+ }
+
+ if(!ILTypeAddLocal(info->context, method->localVarSig,
pinnedType))
+ {
+ CCOutOfMemory();
+ }
+
+ tempVar = ILTypeNumLocals(method->localVarSig) - 1;
+ pinnedVar = ILNode_LocalVar_create(tempVar,
ILTypeToMachineType(type));
+
+ /* Assign the value to the pinned variable */
+ expr = ILNode_Assign_create(pinnedVar, expr);
+ yysetfilename(expr, yygetfilename(exprNode));
+ yysetlinenum(expr, yygetlinenum(exprNode));
+
+ /* Wrap the expression to prevent double evaluation */
+ expr = ILNode_SemGuard_create(expr, value);
+ yysetfilename(expr, yygetfilename(expr));
+ yysetlinenum(expr, yygetlinenum(expr));
+ }
+ else
+ {
+ /* Wrap the expression to prevent double evaluation */
+ expr = ILNode_SemGuard_create(*exprParent, value);
+ yysetfilename(expr, yygetfilename(exprNode));
+ yysetlinenum(expr, yygetlinenum(exprNode));
+ }
+
+ /* Assign the value to the variable */
+ expr = ILNode_Assign_create(nameNode, expr);
+ yysetfilename(expr, yygetfilename(nameNode));
+ yysetlinenum(expr, yygetlinenum(nameNode));
+
+ return expr;
+}
+
%}
/*
@@ -1762,10 +1849,11 @@
*/
ILNode_SemAnalysis(ILNode_FixAddress)
{
- *parent=ILNode_Assign_create(node->name,node->address);
- yysetfilename(*parent, yygetfilename(node));
- yysetlinenum(*parent, yygetlinenum(node));
- ILNode_SemAnalysis(*parent,info,parent);
+ *parent = HandleFixedExpr(info, node->name, node->address,
+ &(node->address), 1);
+
+ /* Perform semantic analysis on the assignment */
+ ILNode_SemAnalysis(*parent, info, parent);
return CSSemValueDefault;
}
@@ -1774,10 +1862,7 @@
*/
ILNode_SemAnalysis(ILNode_FixExpr)
{
- /* Assign the value to the variable */
- *parent = ILNode_Assign_create(node->name, node->expr);
- yysetfilename(*parent, yygetfilename(node));
- yysetlinenum(*parent, yygetlinenum(node));
+ *parent = HandleFixedExpr(info, node->name, node->expr, &(node->expr),
0);
/* Perform semantic analysis on the assignment */
ILNode_SemAnalysis(*parent, info, parent);
Index: include/il_types.h
===================================================================
RCS file: /cvsroot/dotgnu-pnet/pnet/include/il_types.h,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- include/il_types.h 18 Nov 2008 20:06:08 -0000 1.30
+++ include/il_types.h 23 Dec 2008 13:31:15 -0000 1.31
@@ -235,6 +235,13 @@
((type)->kind__ & 0xFF) ==
IL_TYPE_COMPLEX_SENTINEL))
/*
+ * Determine if a type is a managed pointer.
+ */
+#define ILType_IsRef(type) \
+ ((type) != 0 && ILType_IsComplex((type)) && \
+ ILType_Kind((type)) == IL_TYPE_COMPLEX_BYREF)
+
+/*
* Determine if a type is a pointer.
*/
#define ILType_IsPointer(type) \