Виртуальная таблица в llvm (llvm-py)

Я использую llvm-py для создания компилятора DIY для некоторых искусственных, и мне нужна таблица виртуальных методов в области земного шара. Моя концепция состоит в том, чтобы иметь несколько массивов указателей на функции (по одному для каждого класса). К сожалению, нет LLVM IR Builder для глобальной области видимости, и я не могу использовать ptrtoint, чтобы иметь единый тип всех элементов массива (иначе я бы сохранял адреса функций как 64-битные целые числа и приводил их к соответствующим типам перед вызовом). Знаете какое-нибудь разумное решение? Это также можно проиллюстрировать с помощью C++ LLVM api, потому что llvm-py очень похож.


person k_wisniewski    schedule 20.02.2013    source источник
comment
Вы проверяли, что Clang выдает для виртуальных таблиц C++?   -  person    schedule 20.02.2013
comment
Да, он делает некоторые трюки с искажением имен, которые делают код довольно трудным для понимания, и я хотел избежать этого.   -  person k_wisniewski    schedule 20.02.2013


Ответы (1)


Действительно, IRBuilder не предоставляет интерфейс для этого, но вы можете создать его вручную - например. с помощью конструкторов GlobalVariable. Вы можете хранить все указатели в массиве, используя константные выражения преобразования, т.е. генерируя:

@global = global [4 x i64*] [
  i64* bitcast (void()* @f to i64*),
  i64* bitcast (float(i32)* @g to i64*),
  ...
]

Итак, используйте ConstantExpr::getBitCast() для генерации приведения от Function к типу элемента массива (который предпочтительно должен быть указателем, я не вижу преимущества в хранении i64). Затем создайте новый GlobalVariable в модуле и инициализируйте его всеми созданными вами постоянными выражениями.

person Oak    schedule 20.02.2013
comment
Хорошо, я совершенно забыл об этом методе передачи битов, доступном в ConstantExpr. Большое спасибо! - person k_wisniewski; 20.02.2013