2014-12-23 2 views
-1

Я работаю над Clang вилкой для AVR: https://github.com/4ntoine/clang/tree/avr-supportМожет ли Clang использовать LLVM TableGen для изготовления заголовков?

AVR подзадач описаны в LLVM бэкэнд вилкой для AVR AVR.td и LLVM TableGen генерирует AVRSubtarget.h в lib/Target/AVR/

I'de любят использовать AVRSubTypeKV в AVRTargetInfo.hasFeature() в Targets.cpp от генерируется AVRGenSubtargetInfo.inc, чтобы проверить, если функция поддерживается CPU (MCU):

// Sorted (by key) array of values for CPU subtype. 
extern const llvm::SubtargetFeatureKV AVRSubTypeKV[] = { 
    { "at43usb320", "Select the at43usb320 processor", AVR::FeatureAVR31, 0ULL }, 
    { "at43usb355", "Select the at43usb355 processor", AVR::FeatureAVR3, 0ULL }, 
    { "at76c711", "Select the at76c711 processor", AVR::FeatureAVR3, 0ULL }, 
    { "at86rf401", "Select the at86rf401 processor", AVR::FeatureRF401, 0ULL }, 
    { "at90c8534", "Select the at90c8534 processor", AVR::FeatureAVR2, 0ULL }, 
    { "at90can128", "Select the at90can128 processor", AVR::FeatureAVR51, 0ULL }, 
    { "at90can32", "Select the at90can32 processor", AVR::FeatureAVR5, 0ULL }, 
    ... 

I'v e пытался #include <AVRSubtarget.h> от LLVM в Targets.cpp, но он не может быть найден.

Так как я могу использовать файлы LLVM TableGen, созданные в Clang?

ответ

0

Структура сборки LLVM требует файлов заголовков в include/llvm/Target, а затем вы можете включить сгенерированный заголовок с #include "llvm/Target/AVRSubtarget.h". Лучший пример того, как файлы llvm-tblgen можно использовать внутри clang, это заголовок Intrinsics.h в include/llvm/IR/.

+0

Я не уверен, что Transforms является правильным каталогом для него, связанным с Targets, а не Transforms. – 4ntoine

+0

@ 4ntoine жаль, что я спешил, когда написал ответ. Вы абсолютно правы. Заголовки должны быть в подкаталоге, связанном с их использованием. Я отредактировал свой ответ. –

0

Таким образом, вы не должны использовать заголовочные файлы, созданные с помощью backend tablegen. Посмотрите, как другие цели в clang (Targets.cpp и другие файлы, подобные этому) абстрагируют использование заголовка/intrinisic.

Обоснование этого заключается в том, что аспекты переднего конца можно использовать без включения бэкэнда. (ОК, это немного сократилось, так как мы используем бэкэнд для разбора встроенной сборки MS-стиля, но работаем со мной здесь)

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

+0

Я склонен думать, что этот ответ правильный. Мне не удалось найти какую-либо цель, которая использует результаты backend tablegen для функций. Единственная причина, по которой я хотел бы это сделать, это потому, что есть много особенностей-mcus-отношений, и я не понимал, почему бы не сделать это изначально. В предлагаемом подходе я должен описать эти отношения программно в 'hasFeature()'. – 4ntoine

+0

Как вы планируете включить функции с лицевой стороны? То есть если вы собираетесь включить их из командной строки, тогда вам нужно будет добавить поддержку опций командной строки. В тот момент, когда элемент элемента строки очень мал. Посмотрите, как справляются большинство других целей -march и т. Д. – echristo

Смежные вопросы