После множества усилий мне наконец удалось напечатать очень простой LLVM IR. в файл. Теперь, конечно, я приступаю к созданию объектного файла, после чего связываю все, что мне нужно, и вывожу исполняемый файл. В настоящее время используется следующий метод:
Код: Выделить всё
public static unsafe void CompileAndOutput(string projectName, LLVMModuleRef module)
{
LLVM.InitializeAllTargetInfos();
LLVM.InitializeAllTargets();
LLVM.InitializeAllTargetMCs();
LLVM.InitializeAllAsmParsers();
LLVM.InitializeAllAsmPrinters();
sbyte* errorMessage = null;
var targetTriple = LLVM.GetDefaultTargetTriple();
LLVM.SetTarget(module, targetTriple);
LLVMTarget* target = null;
var t = LLVM.GetTarget(module);
if (LLVM.GetTargetFromTriple(targetTriple, &target, &errorMessage) != 0)
{
Console.WriteLine($"Failed to get target from triple: {Marshal.PtrToStringAnsi((IntPtr)errorMessage)}");
return;
}
LLVMTargetMachineRef targetMachine = LLVM.CreateTargetMachine(target, targetTriple,
(sbyte*)Marshal.StringToHGlobalAnsi("generic"), (sbyte*)Marshal.StringToHGlobalAnsi(""),
LLVMCodeGenOptLevel.LLVMCodeGenLevelDefault, LLVMRelocMode.LLVMRelocDefault,
LLVMCodeModel.LLVMCodeModelDefault);
var objectFile = $"{projectName}.o";
if (LLVM.TargetMachineEmitToFile(targetMachine, module, objectFile.ConvertStringToSbytePtr(),
LLVMCodeGenFileType.LLVMAssemblyFile, &errorMessage) != 0)
{
Console.WriteLine($"Failed to emit target machine: {Marshal.PtrToStringAnsi((IntPtr)errorMessage)}");
}
// TODO: Link libraries
LLVM.DisposeModule(module);
}
Попробовав это, очевидно, выдает исключение, о котором я только что упомянул. Еще я попробовал:
Код: Выделить всё
targetMachine.EmitToFile(module, objectFile, LLVMCodeGenFileType.ObjectFile);
Подробнее здесь: https://stackoverflow.com/questions/793 ... etmachinee
Мобильная версия