Lo que necesita es una herramienta para la que pueda definir una sintaxis del lenguaje ensamblador y luego crear analizadores personalizados. Sus analizadores pueden ser simples ("¿cuánto espacio ocupa una instrucción?") O complejos ("¿Cuántos ciclos tardará en ejecutarse esta instrucción?" [Que depende de la secuencia de instrucciones anterior y posiblemente de un modelo sofisticado del procesador que preocuparse]).
Uno diseñado específicamente para hacer eso es el New Jersey Machine Toolkit. Está realmente diseñado para construir generadores de código y depuradores. Sospecho que sería bueno en "conteo de bytes de instrucción". No está claro que sea bueno en análisis más sofisticados. Y creo que insiste en que siga su estilo de sintaxis, en lugar del suyo.
Uno no diseñado específicamente para hacer eso, pero bueno para analizar/analizar langauges en general es nuestro DMS Software Reengineering Toolkit.
DMS se puede dar una descripción gramatical para prácticamente cualquier idioma sin contexto (que cubre la sintaxis del lenguaje ensamblador) y luego analizar una instancia específica de esa gramática (código ensamblador) en AST para su posterior procesamiento. Hemos terminado con varios lenguajes de ensamblaje, incluida la IBM 370, la línea de CPU de 8 bits de Motorola, y un DSP bastante peculiar, sin problemas.
Puede especificar fácilmente una gramática de atributo (cálculo sobre un AST) a DMS. Estas son excelentes maneras de codificar análisis que necesitan solo información local, como "¿Qué tan grande es esta instrucción?". Para un análisis más complejo, necesitará un modelo de procesador impulsado por una serie de instrucciones; Pasar tal modelo de máquina a los AST para instrucciones individuales sería una manera fácil de aplicar un modelo de máquina para calcular cosas más complejas como "¿Cuánto tiempo lleva esta instrucción?".
DMS proporciona otros análisis como flujo de control y flujo de datos en forma genérica. Puede usar un evaluador de atributos para recopilar datos locales ("control-siguiente para esta instrucción es ...", "los datos de esta instrucción fluyen a ...") y alimentarlos a los analizadores de flujo para calcular hechos de flujo global ("si ejecuto esta instrucción, ¿qué otras instrucciones se pueden ejecutar en sentido descendente?" ..)
Debe configurar el DMS para su idioma particular (de ensamblaje). Es diseñado para ser configurado para tareas como estas.
Sí, es probable que pueda codificar todo esto en Python; después de todo, es una máquina de Turing. Pero probablemente no sea tan fácil.
Un beneficio adicional: DMS está dispuesto a aplicar transformaciones a su código, en función de sus análisis. Por lo tanto, podría implementar su optimizador también. Después de todo, debe conectar la indicación de análisis, la optimización es segura, a los pasos de optimización reales.
Creo que es más fácil analizar el LLVM IR ya que utiliza el formulario de SSA para los registros. – delnan
@delnan Estoy de acuerdo, pero estoy agregando un pase de optimización de nivel de ensamblaje, por lo que debo ser capaz de analizar el ASM real generado. – Zeke
¿Puedo sugerir que su pase funcione como un LLVM MachineFunctionPass o si es absolutamente necesario dentro de la infraestructura de MC? Realmente no hay ninguna razón para analizar el asm, reconstruir toda la información de control y flujo de datos, y luego hacer algo de optimización. – ohmantics