Генерация LLVM IR из кода на Haskell

Моя цель - взять исходные коды на разных языках (в основном C, C++, Obj-C и Haskell) и рассказать о них любую статистику. (например, количество переменных, функций, выделения памяти, сложность и т. д.)

LLVM, казалось, был идеальным инструментом для этого, потому что я могу генерировать битовый код для этих языков, и с помощью настраиваемых проходов LLVM я могу сделать почти все. Для семьи C все работает нормально, возьмите программу на C (test.c) например:

#include <stdio.h>
int main( )
{
    int num1, num2, sum;
    printf("Enter two integers: ");
    scanf("%d %d", &num1, &num2); 
    sum = num1 + num2;
    printf("Sum: %d",sum);
    return 0;
}

Тогда я бегу:

clang -emit-llvm test.c -c -o test.bc
opt -load [MY AWESOME PASS] [ARGS]

Вуаля, у меня есть почти все, что мне нужно:

1 instcount - Number of Add insts
 4 instcount - Number of Alloca insts
 3 instcount - Number of Call insts
 3 instcount - Number of Load insts
 1 instcount - Number of Ret insts
 2 instcount - Number of Store insts
 1 instcount - Number of basic blocks
14 instcount - Number of instructions (of all types)
12 instcount - Number of memory instructions
 1 instcount - Number of non-external functions

Я хотел бы добиться того же с программами на Haskell. принимать test.hs:

module Test where

quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser = filter (< p) xs
        greater = filter (>= p) xs

Однако, когда я делаю

ghc -fllvm -keep-llvm-files -fforce-recomp test.hs
opt -load [MY AWESOME PASS] [ARGS]

Я получаю следующие результаты, которые кажутся совершенно бесполезными для моих целей (упомянутых в начале этого поста), потому что они явно не соответствуют этим нескольким строкам кода. Я думаю, это как-то связано с GHC, потому что недавно созданный .ll сам файл 52Kb, в то время как .ll Файл для программы на C составляет всего 2Kb.

31 instcount - Number of Add insts
  92 instcount - Number of Alloca insts
   2 instcount - Number of And insts
  30 instcount - Number of BitCast insts
  24 instcount - Number of Br insts
  22 instcount - Number of Call insts
 109 instcount - Number of GetElementPtr insts
  17 instcount - Number of ICmp insts
  54 instcount - Number of IntToPtr insts
 326 instcount - Number of Load insts
  65 instcount - Number of PtrToInt insts
  22 instcount - Number of Ret insts
 206 instcount - Number of Store insts
   8 instcount - Number of Sub insts
  46 instcount - Number of basic blocks
1008 instcount - Number of instructions (of all types)
 755 instcount - Number of memory instructions
  10 instcount - Number of non-external functions

Мой вопрос заключается в том, как мне продолжать сравнивать код на Haskell с другими без этих огромных чисел? Это вообще возможно? Должен ли я продолжать использовать GHC для генерации IR LLVM? Какие еще инструменты я должен использовать?

0 ответов

Другие вопросы по тегам