Существует ли 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 в качестве аргументов. Задача решена.

Сеппо

0 ответов

Другие вопросы по тегам