Использование Clang и LLVM
Я собираю это:
int main(){
}
С помощью clang, используя эту командную строку:
clang++.exe -S -o %OUTFILE%.clang -emit-llvm %INFILE% -I. -I%INCLUDE_PATH% -std=c++14 -ftemplate-depth=1000
Который дает мне llvm байт-код.
Тогда я использую llc
вот так, чтобы преобразовать байт-код в код c:
llc "%IN_FILE%.clang" -march=c -o foo.c
И получите эту ошибку:
error: unterminated attribute group
attributes #0 = { norecurse nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
Что я делаю не так?
Вот что Clang++ дает мне:
; ModuleID = 'C:\Users\Owner\Documents\C++\SVN\prototypeInd\util\StaticBigInt.cpp'
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc18.0.0"
; Function Attrs: norecurse nounwind readnone uwtable
define i32 @main() #0 {
entry:
ret i32 0
}
attributes #0 = { norecurse nounwind readnone uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"PIC Level", i32 2}
!1 = !{!"clang version 3.8.0 (branches/release_38)"}
Примечание: я использую clang
версия 3.8 и llc
версия 3.4
2 ответа
Когда вы запускаете команду, такую как:
clang -S -emit-llvm ...
Затем компилятор испускает не IR в виде битового кода, а удобочитаемое представление.
Имеет смысл, если все инструменты, которые вы используете, имеют одинаковые версии, или если вы просто хотите проверить вывод вручную.
Однако, читаемый человеком ИК может быть несовместим со старыми инструментами.
В этом случае я могу рекомендовать использовать битовый код напрямую (обратите внимание, что нет -S
параметр больше):
clang -emit-llvm
C бэкэнд в LLVM был удален несколько лет назад. Похоже, что вы пытаетесь передать LLVM IR из последней версии LLVM в llc из старой LLVM. Это, конечно, не поддерживается - ИК не совместим между версиями.