Существует ли LLVM API для установки пакета операндов funclet при обработке исключений LLVM/MSVC?
Я использую библиотеки LLVM 3.9.1 Core для реализации внешнего интерфейса компилятора, ориентированного на Windows x64. В настоящее время я реализую обработку исключений.
Для Windows x64 target LLVM генерирует так называемые funclets для кода перехвата и очистки. Чтобы поймать исключение, вы генерируете инструкцию catchswitch, а затем инструкцию catchpad для каждого пойманного типа исключения:
...
catchsection0: ; preds = %entry
%8 = catchswitch within none [label %catch0] unwind to caller
catch0: ; preds = %catchsection0
%9 = catchpad within %8 [i8** @exceptionClassDescriptor", i32 8, i8** %1]
%10 = load i8*, i8** %1
br label %target10
target10: ; preds = %catch0
%11 = load i8*, i8** @__CD0
%12 = call i1 @RtHandleException(i8* %10, i8* %11) [ "funclet"(token %9) ]
br i1 %12, label %thisHandlerTarget10, label %nextHandlerTarget10
...
Чтобы вызвать функцию в блоке catch, вам нужно установить пакет операндов funclet для инструкции call, передавая токен, возвращенный инструкцией catchpad, в качестве аргумента:
%12 = call i1 @RtHandleException(i8* %10, i8* %11) [ "funclet"(token %9) ]
Я пытался найти в документации по документообороту LLVM и в исходном коде библиотеки LLVM API, как установить пакет операндов funclet для инструкции call или invoke, но безуспешно.
Кто-нибудь знает, как создать пакет операндов и установить его в инструкции вызова?
Я нашел решение, которое было проще, чем я думал: в инструкциях CallInst::Create и InvokeInst::Create есть перегрузки, которые принимают вектор / массив OperandBundleDef в качестве аргументов. Задача решена.
Сеппо