CMM: add a mechanism to import C .data labels
authorSergei Trofimovich <siarheit@google.com>
Mon, 19 Jan 2015 22:27:06 +0000 (16:27 -0600)
committerAustin Seipp <austin@well-typed.com>
Mon, 19 Jan 2015 22:27:07 +0000 (16:27 -0600)
Summary:
This introduces new .cmm syntax for import:

    'import' 'CLOSURE' <identifier>;

Currently cmm syntax allows importing only function labels:

    import pthread_mutex_lock;

but sometimes ghc needs to import global gariables
or haskell closures:

    import ghczmprim_GHCziTypes_True_closure;
    import base_ControlziExceptionziBase_nestedAtomically_closure;
    import ghczmprim_GHCziTypes_False_closure;
    import sm_mutex;

It breaks on ia64 where there is a difference in
pointers to data and pointer to functions.

Patch fixes threaded runtime on ia64 where
dereference of 'sm_mutex' from CMM led to
incurrect location.

Exact breakage machanics are the same as in e18525fae273f4c1ad8d6cbe1dea4fc074cac721

Merge into the 7.10 branch

Signed-off-by: Sergei Trofimovich <siarheit@google.com>
Test Plan: passes ./validate, makes ghci work on ghc-7.8.4

Reviewers: simonmar, simonpj, austin

Reviewed By: austin

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D622

compiler/cmm/CmmParse.y
rts/Exception.cmm
rts/PrimOps.cmm

index 6b51e51..fd9489b 100644 (file)
@@ -575,6 +575,10 @@ importName
         : NAME  
         { ($1, mkForeignLabel $1 Nothing ForeignLabelInExternalPackage IsFunction) }
 
+        -- as previous 'NAME', but 'IsData'
+        | 'CLOSURE' NAME
+        { ($2, mkForeignLabel $2 Nothing ForeignLabelInExternalPackage IsData) }
+
         -- A label imported with an explicit packageId.
         | STRING NAME
         { ($2, mkCmmCodeLabel (fsToPackageKey (mkFastString $1)) $2) }
index 5007ef3..8d19c14 100644 (file)
@@ -13,7 +13,7 @@
 #include "Cmm.h"
 #include "RaiseAsync.h"
 
-import ghczmprim_GHCziTypes_True_closure;
+import CLOSURE ghczmprim_GHCziTypes_True_closure;
 
 /* -----------------------------------------------------------------------------
    Exception Primitives
index 3e8612c..2e6ca46 100644 (file)
 import pthread_mutex_lock;
 import pthread_mutex_unlock;
 #endif
-import base_ControlziExceptionziBase_nestedAtomically_closure;
+import CLOSURE base_ControlziExceptionziBase_nestedAtomically_closure;
 import EnterCriticalSection;
 import LeaveCriticalSection;
-import ghczmprim_GHCziTypes_False_closure;
+import CLOSURE ghczmprim_GHCziTypes_False_closure;
 #if defined(USE_MINIINTERPRETER) || !defined(mingw32_HOST_OS)
-import sm_mutex;
+import CLOSURE sm_mutex;
 #endif
 
 /*-----------------------------------------------------------------------------