Сборка LLVM: назначить целочисленную константу для регистрации - PullRequest
11 голосов
/ 16 июня 2011

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

@0 = private constant [25 x i8] c"Hello World to %dntegers\00"

declare void @printf (i8*, i32)

define void @main () {
  %1 = getelementptr [25 x i8]* @0, i32 0, i32 0
  %2 = 1
  tail call void @printf(i8* %1, i32 %2)
  ret void
}

Но я получаю следующую ошибку:

c.ll:8:8: error: expected instruction opcode
  %2 = 1
       ^

Документация показывает подобных примеров .

Вы знаете, как заставить это работать?В настоящее время я использую вместо:

  %2 = add i32 0, 1 ; FIXME

Ответы [ 2 ]

14 голосов
/ 16 июня 2011

См. Обсуждение LLVMdev "Как назначить константу для регистра?" Как указал Дункан Сэндс:

позвольте мне сказать, что в общем случае этобессмысленно.Из-за формы SSA, если% x установлен на 5, вы не сможете установить его позже.Таким образом, везде, где вы используете% x, вы можете вместо этого просто использовать 5.Обычная ситуация состоит в том, что у вас есть регистр% x, и благодаря выполнению оптимизации вы обнаружите, что на самом деле% x всегда будет иметь значение 5. Вы можете использовать RAUW (он же метод replaceAllUsesWith) для замены% x на 5 везде.

Поток сгенерировал пару альтернатив непосредственному использованию константы:

  • Используйте alloca, чтобы получить указатель, сохранить его, а затем загрузить значение по мере необходимости.
  • Создайте глобальный указатель на константу, затем загрузите это значение по мере необходимости.

Кто-то отметил, что подход alloca в конечном итоге будет использовать регистр после оптимизации.

Несмотря на это, использование константы напрямую, как предлагает @ SK-logic, кажется наиболее чистым решением.

0 голосов
/ 18 июня 2011

% 1 - без имени .Вместо этого используйте% name_here.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...