Update GC intrinsics to take a pointer to the object as well as a pointer
authorChris Lattner <sabre@nondot.org>
Thu, 22 Jul 2004 05:51:13 +0000 (05:51 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 22 Jul 2004 05:51:13 +0000 (05:51 +0000)
to the field being updated.  Patch contributed by Tobias Nurmiranta

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15097 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LowerGC.cpp
runtime/GC/GCInterface.h
runtime/GC/SemiSpace/semispace.c

index 0c03b91d55e0d21af36d38f7e3cffeff1de15ac1..2e03807ed2434930b20128ca2353f3b99368d7f5 100644 (file)
@@ -109,10 +109,10 @@ bool LowerGC::doInitialization(Module &M) {
   // If the program is using read/write barriers, find the implementations of
   // them from the GC runtime library.
   if (GCReadInt)        // Make:  sbyte* %llvm_gc_read(sbyte**)
-    GCRead = M.getOrInsertFunction("llvm_gc_read", VoidPtr, VoidPtrPtr, 0);
+    GCRead = M.getOrInsertFunction("llvm_gc_read", VoidPtr, VoidPtr, VoidPtrPtr, 0);
   if (GCWriteInt)       // Make:  void %llvm_gc_write(sbyte*, sbyte**)
     GCWrite = M.getOrInsertFunction("llvm_gc_write", Type::VoidTy,
-                                    VoidPtr, VoidPtrPtr, 0);
+                                    VoidPtr, VoidPtr, VoidPtrPtr, 0);
 
   // If the program has GC roots, get or create the global root list.
   if (GCRootInt) {
@@ -182,14 +182,17 @@ bool LowerGC::runOnFunction(Function &F) {
               CI->setOperand(0, GCWrite);
               // Insert casts of the operands as needed.
               Coerce(CI, 1, VoidPtr);
-              Coerce(CI, 2, VoidPtrPtr);
+              Coerce(CI, 2, VoidPtr);
+              Coerce(CI, 3, VoidPtrPtr);
             } else {
-              Coerce(CI, 1, VoidPtrPtr);
+              Coerce(CI, 1, VoidPtr);
+              Coerce(CI, 2, VoidPtrPtr);
               if (CI->getType() == VoidPtr) {
                 CI->setOperand(0, GCRead);
               } else {
                 // Create a whole new call to replace the old one.
-                CallInst *NC = new CallInst(GCRead, CI->getOperand(1),
+                CallInst *NC = new CallInst(GCRead, CI->getOperand(1), 
+                                            CI->getOperand(2),
                                             CI->getName(), CI);
                 Value *NV = new CastInst(NC, CI->getType(), "", CI);
                 CI->replaceAllUsesWith(NV);
index e2a9b68fc70d30a5cf44a0d46a58a8019b4e4925..e83abe0d167bd9a6d089e885a73e22e148629dc3 100644 (file)
@@ -38,11 +38,11 @@ void llvm_gc_collect();
 /* llvm_gc_read - This function should be implemented to include any read
  * barrier code that is needed by the garbage collector.
  */
-void *llvm_gc_read(void **P);
+void *llvm_gc_read(void *ObjPtr, void **FieldPtr);
 
 /* llvm_gc_write - This function should be implemented to include any write
  * barrier code that is needed by the garbage collector.
  */
-void llvm_gc_write(void *V, void **P);
+void llvm_gc_write(void *V, void *ObjPtr, void **FieldPtr);
 
 #endif
index df60b623b0db3d50b1f149a43c8f7c8ac30f2818..cb5864b0bd6d836c1602400895f833a2aa1f930c 100644 (file)
@@ -89,8 +89,8 @@ void llvm_gc_collect() {
 }
 
 /* We use no read/write barriers */
-void *llvm_gc_read(void **P) { return *P; }
-void llvm_gc_write(void *V, void **P) { *P = V; }
+void *llvm_gc_read(void *ObjPtr, void **FieldPtr) { return *FieldPtr; }
+void llvm_gc_write(void *V, void *ObjPtr, void **FieldPtr) { *FieldPtr = V; }
 
 
 /*===----------------------------------------------------------------------===**