Я создал очень простой фрагмент кода LLVM IR через API.Внутри основного блока я хочу вставить вызовы функций, доступных в стандартной библиотеке C, таких как malloc
, printf
или некоторых других, которые я пишу на C самостоятельно.
; ModuleID = 'main.d2'
source_filename = "main.d2"
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-darwin17.7.0"
define i32 @main() {
%1 = alloca i32
store i32 0, i32* %1
вставить вызов здесь
%2 = load i32, i32* %1
ret i32 %2
}
Я скомпилировал битовый код с
llc -filetype=obj -o main.o main.bit
и связать объекты с помощью
clang main.o -o main
команд.
Вопросы
Нужно ли связывать C stdlib впоследний шаг с флагами компилятора и / или мне подготовить библиотеку-обертку на C, которая включает в себя функции, которые мне нужны для компиляции чего-то вроде clib.o
для внешней связи?Является ли вторая команда правильным способом для связывания таких внешних зависимостей?
Кроме того, как она будет вести себя в Windows (я сейчас на Mac или Ubuntu), если я используютакой же подход?Что должно измениться в моем рабочем процессе?
Я что-то упускаю здесь, что делает всю проблему неактуальной?
Моя машина:
clang version 7.0.0 (tags/RELEASE_700/final)
Target: x86_64-apple-darwin18.0.0
Thread model: posix
InstalledDir: /opt/local/libexec/llvm-7.0/bin