-- Turns bytecode AST into CFGs MODULE {TrfToCFG} {cfgsSwf,cfgsAbc} {} INCLUDE "ByteCodeAst.ag" INCLUDE "ByteCodeLocationInfo.ag" import { import Data.ByteString.Lazy(ByteString,pack) import ByteCode import CFG import Data.Word import qualified Data.Set as Set import Data.Set(Set) import qualified Data.Map as Map import Data.Map(Map) import Codec.Binary.UTF8.String } WRAPPER SwfFile WRAPPER AbcFile { -- | Obtains CFGs of all programs in a Swf file cfgsSwf :: SwfFile -> Programs cfgsSwf file = out where inh = Inh_SwfFile { guid_Inh_SwfFile = 1 } sem = sem_SwfFile file syn = wrap_SwfFile sem inh out = programs_Syn_SwfFile syn -- | Obtains CFGs of a programs (only one) in an Abc file cfgsAbc :: AbcFile -> Programs cfgsAbc file = out where inh = Inh_AbcFile { guid_Inh_AbcFile = 1 } sem = sem_AbcFile file syn = wrap_AbcFile sem inh out = programs_Syn_AbcFile syn } SET CodePath = BodyInfos BodyInfo Instructions Instruction ATTR OnlySwfAbc [ | | programs USE {++} {[]} : Programs ] ATTR CodePath [ | | graphs USE {++} {[]} : CFGs ] SEM AbcFile | File lhs.programs = [Program_Program @bodies.graphs] ATTR OnlySwfAbc CodePath [ | guid : Int | ] -- unique numbering -- Ensures that the attributes are in different visits SEM BodyInfo | Info instructions.guid < instructions.revLocation