From: Clemens Fruhwirth Date: Fri, 13 Jul 2007 21:08:45 +0000 (+0000) Subject: Add import facility to cmm parser X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=d55027c917a101692ded11b6b1421052866df2d4 Add import facility to cmm parser The cmm parser classified all unknown variables as imported. This behaviour is not changed with this patch. Explicitly imported variables get a different internal label type, namely ForeignLabel instead of RtsLabel. In PIC compilation, the NCG creates dynamic access for ForeignLabel, while RtsLabel are not treated as PIC when -package rts. Hence, putting explicit imports into cmm files enables the NCG to distinguish between RTS-external and RTS-internal symbols, and create the appropriate code. --- diff --git a/compiler/cmm/CmmParse.y b/compiler/cmm/CmmParse.y index fa822f6..579df5e 100644 --- a/compiler/cmm/CmmParse.y +++ b/compiler/cmm/CmmParse.y @@ -294,7 +294,7 @@ decl :: { ExtCode } | STRING type names ';' {% do k <- parseKind $1; return $ mapM_ (newLocal k $2) $3 } - | 'import' names ';' { return () } -- ignore imports + | 'import' names ';' { mapM_ newImport $2 } | 'export' names ';' { return () } -- ignore exports names :: { [FastString] } @@ -793,6 +793,13 @@ newLocal kind ty name = do addVarDecl name (CmmReg (CmmLocal reg)) return reg +-- Creates a foreign label in the import. CLabel's labelDynamic +-- classifies these labels as dynamic, hence the code generator emits the +-- PIC code for them. +newImport :: FastString -> ExtFCode () +newImport name = + addVarDecl name (CmmLit (CmmLabel (mkForeignLabel name Nothing True))) + newLabel :: FastString -> ExtFCode BlockId newLabel name = do u <- code newUnique