Как сгенерировать биткод из dragonegg - PullRequest
0 голосов
/ 25 сентября 2011

Назад, когда dragonegg был в llvm-gcc , можно было выдать -emit-llvm, и он генерировал битовый код llvm.Теперь, когда я использую dragonegg в качестве плагина (gcc -fplugin=dragonegg.so), я больше не могу найти такую ​​опцию.Единственное, что я обнаружил, это генерация LLVM IR - это не то, что я хочу.Как все еще возможно генерировать битовый код?

GCC равен 4.6, LLVM и Dragonegg являются текущими SVN.И использование clang не вариант, так как его поддержка C ++ 11 слабая.

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Так как вывод битового кода LLVM кажется невозможным, я написал скрипт на python, который затем передает IR в llvm-as , который затем дает мне битовый код.С точки зрения производительности это катастрофа, но, по крайней мере, она работает.

#/usr/bin/env python

import sys, subprocess

args = list(sys.argv)
del args[0] # Remove our exec name
compiler = args[0] 
del args[0] # Remove the compile name

compileArguments = [compiler]
outputFile = ''

foundFile = False

for arg in args:
if arg.startswith('-o'):
    foundFile = True
elif foundFile:
    outputFile = arg
    foundFile = False
    arg = "/dev/stdout"

compileArguments.append(arg)

compileProcess = subprocess.Popen(compileArguments, stdout=subprocess.PIPE)
asbin = 'llvm-as'

ir2bcProcess = subprocess.Popen([asbin, '-f', '-o=' + outputFile], stdin=compileProcess.stdout)

stdout, stderr = ir2bcProcess.communicate()

compileProcess.wait()
ir2bcProcess.wait()
0 голосов
/ 25 сентября 2011

Из README :

-fplugin-arg-dragonegg-emit-ir
-flto
  Output LLVM IR rather than target assembler.  You need to use -S with this,
  since otherwise GCC will pass the output to the system assembler (these don't
  usually understand LLVM IR).  It would be nice to fix this and have the option
  work with -c too but it's not clear how.  If you plan to read the IR then you
  probably want to use the -fverbose-asm flag as well (see below).
...