Как исправить исключение AccessViolationException, возникающее при вызове LLVM.TargetMachineEmitToFile?C#

Место общения программистов C#
Ответить
Anonymous
 Как исправить исключение AccessViolationException, возникающее при вызове LLVM.TargetMachineEmitToFile?

Сообщение Anonymous »

Я уже некоторое время работаю над проектом и за последние несколько недель неоднократно сталкивался с проблемой. Я пишу компилятор и решил использовать LLVM, чтобы попытаться преобразовать мой IR в исполняемый файл.
После множества усилий мне наконец удалось напечатать очень простой 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);
}
Что бы я ни делал, я продолжаю получать AccessViolationExceptions при вызове LLVM.TargetMachineEmitToFile
Попробовав это, очевидно, выдает исключение, о котором я только что упомянул. Еще я попробовал:

Код: Выделить всё

targetMachine.EmitToFile(module, objectFile, LLVMCodeGenFileType.ObjectFile);
Я получил те же результаты, и в настоящее время у меня пустой объектный файл. Я надеялся, что смогу записать код в файл и начать работу над реальным процессом связывания необходимых библиотек, но теперь я застрял. Итак, как я могу решить эту проблему?


Подробнее здесь: https://stackoverflow.com/questions/793 ... etmachinee
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»