2017-02-18 31 views
1

Я хочу применить алгоритм, который предполагает регистры R0, R1,...,Rn.Управление регистрами x86 через LLVM IR?

В этом случае я хочу контролировать, какой порядок эти регистры присваиваются.

Возможно ли на уровне LLVM IR управлять регистрами, или же ИК-экран экранирует эти низкоуровневые детали?

+0

Это возможно с встроенной сборкой, которая может быть не такой, какой вы хотите. ИК-уровень больше уровня С, чем уровень сборки по этому аспекту. – Joky

+0

Какие вызовы методов доступны для встроенной сборки? – Shuzheng

+0

Я не понимаю вопроса? – Joky

ответ

0

Вы можете использовать llvm.read_register и llvm.write_register на более поздних версиях llvm.

Если вы хотите хороший пример, попробуйте создать глобальную переменную следующим образом:

register void *rsp asm("rsp"); 

Затем попытайтесь напечатать его с Printf. Компиляция простой программы C с -S -emit-LLVM и вы можете увидеть llvm.read_register используется

%4 = call i64 @llvm.read_register.i64(metadata !0) 

А в нижней части файла вы увидите индекс метаданных 0:

!0 = !{!"rsp"} 
+0

Но разве это не превратится в «mov rax, rsp' или что-то еще? Он не позволяет вам контролировать, какой регистр хранится в '% 4'. –

+0

Это не всегда правильно, но даже если это не был оптимизатор, он обязательно вызовет проблемы. Встроенная сборка, вероятно, является лучшим способом сделать то, что хочет OP специально – keyboardsmoke