Author: laijx
Date: 2011-02-22 04:14:56 -0500 (Tue, 22 Feb 2011)
New Revision: 3487

Modified:
   trunk/osprey/common/com/symtab_access.h
   trunk/osprey/common/com/symtab_defs.h
   trunk/osprey/ipa/main/optimize/ipo_alias_class.cxx
   trunk/osprey/wgen/wgen_decl.cxx
Log:
Fix the bug 718. This patch contains 3 kinds of changes:
1. Remove unused PU flag PU_IS_MALLOC since it's never used.
2. Enhance the WGEN to set the PU_HAS_ATTR_MALLOC if
__attribute__((__malloc__)) is specified. Enhance the
IP_ALIAS_CLASSIFICATION::Callee_returns_new_memory() to detect this
flag.
3. Bug fix for 718. In this case, 'malloc' is a user defined function
but marked as 'return new memory', which will cause the assertion in
Handle_function_definition(). In this patch, we also check if the
function is user defined or not by detecting the sclass. Also, for
function 'returns new memory', Return_class_member() should be used
instead of Returns().

Code Reviewed by Sun.



Modified: trunk/osprey/common/com/symtab_access.h
===================================================================
--- trunk/osprey/common/com/symtab_access.h     2011-02-22 08:54:12 UTC (rev 
3486)
+++ trunk/osprey/common/com/symtab_access.h     2011-02-22 09:14:56 UTC (rev 
3487)
@@ -1033,13 +1033,6 @@
 Clear_PU_is_operator (PU& pu)    { pu.flags &= ~PU_IS_OPERATOR; }
 
 inline BOOL
-PU_is_malloc (const PU& pu)                    { return (pu.flags & 
PU_IS_MALLOC) != 0; } 
-inline void
-Set_PU_is_malloc (PU& pu)                      { pu.flags |= PU_IS_MALLOC; }
-inline void
-Clear_PU_is_malloc (PU& pu)                    { pu.flags &= ~PU_IS_MALLOC; }
-
-inline BOOL
 PU_has_attr_malloc (const PU& pu)      { return (pu.flags & 
PU_HAS_ATTR_MALLOC) != 0; } 
 inline void
 Set_PU_has_attr_malloc (PU& pu)        { pu.flags |= PU_HAS_ATTR_MALLOC; }

Modified: trunk/osprey/common/com/symtab_defs.h
===================================================================
--- trunk/osprey/common/com/symtab_defs.h       2011-02-22 08:54:12 UTC (rev 
3486)
+++ trunk/osprey/common/com/symtab_defs.h       2011-02-22 09:14:56 UTC (rev 
3487)
@@ -739,7 +739,6 @@
 #define PU_NO_INSTRUMENT        0x0000010000000000LL // -finstrument-functions 
will skip PU
 #endif
 
-#define PU_IS_MALLOC            0x0000020000000000LL // 
__attribute__((malloc)) semantic 
 #define PU_HAS_ATTR_MALLOC      0x0000020000000000LL // 
__attribute__((malloc)) semantic 
 #define PU_HAS_ATTR_PURE        0x0000040000000000LL // __attribute__((pure)) 
semantic 
 #define PU_HAS_ATTR_NORETURN    0x0000080000000000LL // 
__attribute__((noreturn)) semantic

Modified: trunk/osprey/ipa/main/optimize/ipo_alias_class.cxx
===================================================================
--- trunk/osprey/ipa/main/optimize/ipo_alias_class.cxx  2011-02-22 08:54:12 UTC 
(rev 3486)
+++ trunk/osprey/ipa/main/optimize/ipo_alias_class.cxx  2011-02-22 09:14:56 UTC 
(rev 3487)
@@ -1475,7 +1475,7 @@
   ST *pu_st = Scope_tab[CURRENT_SYMTAB].st;
   IP_ALIAS_CLASS_REP *pu_acr =
     _base_id_map[Base_id(pu_st, 0ll)]->Base_member().Alias_class();
-  IP_ALIAS_CLASS_MEMBER *return_ac_member = pu_acr->Signature().Returns();
+  IP_ALIAS_CLASS_MEMBER *return_ac_member = 
pu_acr->Signature().Return_class_member();
 
   Classify_deref_of_expr(return_ac_member, WN_kid0(stmt), FALSE);
 
@@ -1544,16 +1544,7 @@
   if (WN_Call_Does_Mem_Alloc(call_wn))
     return TRUE;
   if (WN_operator(call_wn) == OPR_CALL) {
-    const ST *const st = WN_st(call_wn);
-
-    // Cheap hack for now, to test performance. This should be based on
-    // some real mechanism in the future instead of cheesebag hacks.
-    if ((strcmp("malloc", ST_name(st)) == 0) ||
-       (strcmp("alloca", ST_name(st)) == 0) ||
-       (strcmp("calloc", ST_name(st)) == 0) ||
-       (strcmp("_F90_ALLOCATE", ST_name(st)) == 0)) {
-      return TRUE;
-    }
+    return Callee_returns_new_memory(WN_st(call_wn));
   }
   else if (WN_operator(call_wn) == OPR_INTRINSIC_CALL) {
     if ((WN_intrinsic(call_wn) == INTRN_U4I4ALLOCA) ||
@@ -1571,13 +1562,18 @@
 BOOL
 IP_ALIAS_CLASSIFICATION::Callee_returns_new_memory(const ST *const st)
 {
+  Is_True(ST_class(st) == CLASS_FUNC, ("invalid st class"));
+  if (PU_has_attr_malloc (Pu_Table[ST_pu(st)]))
+    return TRUE;
+
 #ifdef KEY
   // Cheap hack for now, to test performance. This should be based on
   // some real mechanism in the future instead of cheesebag hacks.
-  if ((strcmp("malloc", ST_name(st)) == 0) ||
-      (strcmp("alloca", ST_name(st)) == 0) ||
-      (strcmp("calloc", ST_name(st)) == 0) ||
-      (strcmp("_F90_ALLOCATE", ST_name(st)) == 0)) {
+  if ((strcmp("malloc", ST_name(st)) == 0 ||
+       strcmp("alloca", ST_name(st)) == 0 ||
+       strcmp("calloc", ST_name(st)) == 0 ||
+       strcmp("_F90_ALLOCATE", ST_name(st)) == 0) &&
+      ST_sclass(st) == SCLASS_EXTERN) {
     return TRUE;
   }
   else {

Modified: trunk/osprey/wgen/wgen_decl.cxx
===================================================================
--- trunk/osprey/wgen/wgen_decl.cxx     2011-02-22 08:54:12 UTC (rev 3486)
+++ trunk/osprey/wgen/wgen_decl.cxx     2011-02-22 09:14:56 UTC (rev 3487)
@@ -1484,6 +1484,9 @@
          else if (is_attribute("used", attr))
            Set_PU_no_delete (Pu_Table [ST_pu (func_st)]);  // bug 3697
 #endif
+          else if (is_attribute("malloc", attr)) {
+            Set_PU_has_attr_malloc (Pu_Table [ST_pu (func_st)]);
+          }
        }
       } 
     }


------------------------------------------------------------------------------
Index, Search & Analyze Logs and other IT data in Real-Time with Splunk 
Collect, index and harness all the fast moving IT data generated by your 
applications, servers and devices whether physical, virtual or in the cloud.
Deliver compliance at lower cost and gain new business insights. 
Free Software Download: http://p.sf.net/sfu/splunk-dev2dev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to