2012-02-02 4 views
1

Инструмент, над которым я работаю, должен взять промежуточный формат, сгенерированный компилятором, добавить к нему некоторый код и затем передать этот модифицированный промежуточный код в бэкэнд компилятора для генерации окончательного код.Самый простой способ работы с промежуточным форматом

Проведя небольшое исследование gcc, я обнаружил, что формат GIMPLE легко понять, но я не уверен в сложности модификации кода GIMPLE и не знаю, как можно перезапустить компиляцию из там, кроме использования плагинов и добавления собственного прохода. Также люди предупредили меня, что документации недостаточно, и становится все труднее, когда вы застреваете при работе с gcc.

Другой вариант - использовать байт-код LLVM. Но я никогда не работал с LLVM, поэтому не знаю, насколько сложна моя задача с LLVM. Там, возможно, даже лучшие варианты, о которых я не знаю. Поэтому я просто хочу знать лучший вариант. Мои предпочтения заключаются в следующем.

  • Платформа индепендентство
  • Простота в использовании
  • Хорошо документировано
  • Больше людей, используя его, так больше помощи доступной
+0

Точка данных относительно LLVM: они не уклоняются от изменения API, которые сосут. Вы * можете * утверждать, что это заставляет нервничать, но это также означает, что существует сегодня, вероятно, хорошо и, вероятно, улучшится, а не станет старым и разоренным. Это также современный C++ - если вы можете проглотить это, это упростит вашу жизнь. – delnan

+0

@ delnan, я читал, что LLVM не очень независима от платформы. Это правда? Мне нужен промежуточный код, который можно скомпилировать для любой платформы. Что касается LLVM с использованием C++, я довольно крут с этим, infact Я предпочитаю C++ над C. – MetallicPriest

+0

Определите платформу независимо. Существует не так много бэкендов, как для GCC, но многочисленные общие архитектуры охвачены, и я не знаю никаких проблем, препятствующих добавлению большего количества бэкэндов. Но не делайте ошибок, есть * проблемы, которые не будут решены в ближайшее время (например, обработка исключений C++ в Windows). – delnan

ответ

1

Как вы, наверное, уже знаете, MELT является областью высокого уровня для расширения GCC. Вы можете легко работать с Gimple (и т. Д.) С ним (а также модифицировать внутренние представления в Gcc)

Однако расширение GCC означает некоторую работу, поскольку представления Gimple (а также Tree) (с другими , например, Edges ..) являются сложными ...

0

Это может быть не очень полезно, но я задавался вопросом об обработке проходов gcc. Сокращенный (урезано в основном EXEC/вилка вызовов) выход из strace -f -o gcc.strace gcc -c tstamp.c:

7141 execve("/usr/bin/gcc", ["gcc", "-c", "tstamp.c"], [/* 52 vars */]) = 0 
7141 open("/tmp/ccqzaCI4.s", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 3 
7141 close(3)       = 0 
7141 vfork(<unfinished ...> 
7142 execve("/usr/libexec/gcc/i686-redhat-linux/4.6.1/cc1", ["/usr/libexec/gcc/i686-redhat-lin"..., "-quiet", "tstamp.c", "-quiet", "-dumpbase", "tstamp.c", "-mtune=generic", "-march=i686", "-auxbase", "tstamp", "-o", "/tmp/ccqzaCI4.s"], [/* 55 vars */] <unfinished ...> 
7141 <... vfork resumed>)    = 7142 
7141 waitpid(7142, <unfinished ...> 
7142 <... execve resumed>)   = 0 
7142 open("tstamp.c", O_RDONLY|O_NOCTTY|O_LARGEFILE) = 3 
7142 close(3)       = 0 
7142 open("/tmp/ccqzaCI4.s", O_RDWR|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 
7142 open("/usr/include/stdio.h", O_RDONLY|O_NOCTTY|O_LARGEFILE) = 4 
... (opens and closes every include file) 
7142 close(4)       = 0 
7142 close(3)       = 0 
7142 exit_group(0)      = ? 
7141 <... waitpid resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 7142 
7141 vfork(<unfinished ...> 
7143 execve("/usr/bin/as", ["as", "--32", "-o", "tstamp.o", "/tmp/ccqzaCI4.s"], [/* 55 vars */] <unfinished ...> 
7141 <... vfork resumed>)    = 7143 
7141 waitpid(7143, <unfinished ...> 
7143 <... execve resumed>)   = 0 
7143 unlink("tstamp.o")    = 0 
7143 open("tstamp.o", O_RDWR|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 
7143 open("/tmp/ccqzaCI4.s", O_RDONLY|O_LARGEFILE) = 4 
7143 close(4)       = 0 
7143 close(3)       = 0 
7143 exit_group(0)      = ? 
7141 <... waitpid resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 7143 
7141 unlink("/tmp/ccqzaCI4.s")   = 0 
7141 exit_group(0)      = ? 

cc1 имеет все применимое логику. Я полагаю, что это комплексная программа, особенно после ввода:

/usr/libexec/gcc/i686-redhat-linux/4.6.1/cc1 --help 

и

/usr/libexec/gcc/i686-redhat-linux/4.6.1/cc1 --help=C 
+0

Вам не нужно 'strace', просто запустите' gcc -v' (с другими аргументами), и он покажет вам, с каких процессов он запускается ... Действительно, большая часть собственно компиляции выполняется его 'cc1' ... –

+0

Чтобы просмотреть внутренние пропуски компилятора (а не компоновщик, а не ассемблер), запустите gcc с секретными параметрами: '-fdump-rtl-all-all -fdump-tree-all-all -fdump-ipa-all-all' = это приведет к сбросу внутреннего представления программы после EACH перехода и фазы оптимизации. Чтобы увидеть, как работает компоновщик, используйте опцию gcc '-Wl, - verbose'. Но .. остановись .. У тебя есть 18к, и этот пост не ответ, это что-то вроде вопроса, не так ли? – osgx

+0

@osgx: согласен, это не полный ответ, только способный помочь дальнейшим исследованиям. Добавленная вами информация очень ценна. – wallyk

1

По вашему описанию, LLVM соответствует требованиям идеально. Одна из его главных целей - служить гибкой библиотекой и основой для манипулирования IR-кодом. Бесчисленная оптимизация, трансформация и анализ «проходит», она приходит как служить доказательством и прекрасными примерами. ИМО LLVM также отвечает на 4 очка вы перечисляете в вашем вопросе очень хорошо:

  • Платформа индепендентство: LLVM работает на основных платформах (Linux, Mac и Windows) и знает, как генерировать код для многих типов процессоров.
  • Прост в использовании: IR и компиляторы являются сложной областью для взлома, но насколько это возможно, LLVM - хороший кандидат, поскольку это относительно новый проект, хорошо документированный, с очень чистой базой кода.
  • Хорошо документировано: knock yourself out
  • Больше людей, использующих его: очень активная разработка и использование, причем некоторые корпорации уже вложили в нее значительные средства (в первую очередь Apple и Google).
Смежные вопросы