LLVM IR вызов и связывание printf или любой внешней функции C в портативном виде - PullRequest
0 голосов
/ 28 октября 2018

Я создал очень простой фрагмент кода 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

1 Ответ

0 голосов
/ 28 октября 2018

Я что-то упускаю здесь, что делает всю проблему неактуальной?

Да, вы используете clang для связи.Он знает, как и когда выполняется ссылка C времени выполнения и все эти crt вещи.Вы даже можете напрямую передать текстовый ИК на clang.

...