1 | module Compiler.NoMangle
4 | import Libraries.Data.NameMap
5 | import Libraries.Data.NameMap.Traversable
8 | record NoMangleMap where
10 | map : NameMap String
20 | {auto d : Ref Ctxt Defs} ->
21 | (backends : List String) ->
22 | (valid : String -> Bool) ->
23 | Core (Ref NoMangleMap NoMangleMap)
24 | initNoMangle backends valid = do
26 | map <- traverseNameMap
28 | let Just (backend, expName) = lookupBackend backends exps
29 | | Nothing => throw (GenericMsg EmptyFC """
30 | No valid %export specifier for \{show name}
31 | Supported backends: \{showSep ", " backends}
32 | Given backends: \{showSep ", " (fst <$> exps)}
34 | let True = valid expName
35 | | False => throw (GenericMsg EmptyFC "\"\{expName}\" is not a valid name on \{backend} backend")
38 | newRef NoMangleMap $
MkNMMap map
40 | lookupBackend : List String -> List (String, String) -> Maybe (String, String)
41 | lookupBackend [] exps = Nothing
42 | lookupBackend (b :: bs) exps =
43 | case lookup b exps of
44 | Just exp => Just (b, exp)
45 | Nothing => lookupBackend bs exps
48 | isNoMangle : NoMangleMap -> Name -> Maybe String
49 | isNoMangle nm n = lookup n nm.map
53 | {auto nm : Ref NoMangleMap NoMangleMap} ->
56 | lookupNoMangle n = pure $
isNoMangle !(get NoMangleMap) n