Я использую llvm-py для создания компилятора DIY для некоторых искусственных, и мне нужна таблица виртуальных методов в области земного шара. Моя концепция состоит в том, чтобы иметь несколько массивов указателей на функции (по одному для каждого класса). К сожалению, нет LLVM IR Builder для глобальной области видимости, и я не могу использовать ptrtoint, чтобы иметь единый тип всех элементов массива (иначе я бы сохранял адреса функций как 64-битные целые числа и приводил их к соответствующим типам перед вызовом). Знаете какое-нибудь разумное решение? Это также можно проиллюстрировать с помощью C++ LLVM api, потому что llvm-py очень похож.
Виртуальная таблица в llvm (llvm-py)
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
Хорошо, я совершенно забыл об этом методе передачи битов, доступном в ConstantExpr. Большое спасибо!
- person k_wisniewski; 20.02.2013