Написание байтового кода - PullRequest
6 голосов
/ 24 марта 2011

Я только что обнаружил LLVM и пока не знаю много об этом. Я пробовал это, используя llvm в браузере . Я вижу, что любой код C, который я пишу, преобразуется в байтовый код LLVM, который затем преобразуется в собственный код. На странице показано текстовое представление байтового кода. Например, для следующего кода C:

int array[] = { 1, 2, 3};

int foo(int X) {
  return array[X];
}

Показывает следующий байт-код:

target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-linux-gnu"

@array = global [3 x i32] [i32 1, i32 2, i32 3]   ; <[3 x i32]*> [#uses=1]

define i32 @foo(i32 %X) nounwind readonly {
entry:
  %0 = sext i32 %X to i64                         ; <i64> [#uses=1]
  %1 = getelementptr inbounds [3 x i32]* @array, i64 0, i64 %0 ; <i32*> [#uses=1]
  %2 = load i32* %1, align 4                      ; <i32> [#uses=1]
   ret i32 %2
}

Мой вопрос: могу ли я написать байт-код и передать его ассемблеру llvm для преобразования в нативный код, пропустив первый шаг написания кода на C вообще? Если да, то как мне это сделать? У кого-нибудь есть указатели для меня?

Ответы [ 2 ]

7 голосов
/ 08 апреля 2011

Одной очень важной особенностью (и целью разработки) языка IR LLVM является его трехстороннее представление:

  • Текстовое представление, которое вы можете увидеть здесь
  • Представление байт-кода (или в двоичной форме)
  • Представление в памяти

Все 3 действительно полностью взаимозаменяемы.Ничто из того, что можно выразить в одном, не может быть выражено и в двух других.

Поэтому, пока вы соблюдаете синтаксис, вы действительно можете написать IR самостоятельно.Это довольно бессмысленно, если только не используется в качестве упражнения, чтобы привыкнуть к формату, лучше ли читать (и диагностировать) IR или создавать собственный компилятор :)

6 голосов
/ 24 марта 2011

Да, конечно, вы можете.Во-первых, вы можете написать LLVM IR вручную.Все инструменты, такие как llc (который сгенерирует для вас собственный код) и opt (LLVM IR => LLVM IR optimizer) принимают текстовое представление LLVM IR в качестве входных данных.

...