Экспериментирую с LLVM, за основу взял калейдоскоп и слегка переделал его.
Было:
if (F->getName() != Name) {
// Delete the one we just made and get the existing one.
F->eraseFromParent();
F = TheModule->getFunction(Name);
// If F already has a body, reject this.
if (!F->empty()) {
ErrorF("redefinition of function");
return 0;
}
// If F took a different number of args, reject.
if (F->arg_size() != Args.size()) {
ErrorF("redefinition of function with different # args");
return 0;
}
}
if (F->getName() != Name) {
// Delete the one we just made and get the existing one.
TheModule->getFunction(Name)->eraseFromParent();
F->setName(Name);
}
Проблема вот в чем:
Если объявить функцию def test(x) x+1;
Получим такое промежуточное представление:
define double @test(double %x) {
entry:
%addtmp = fadd double 1.000000e+00, %x
ret double %addtmp
}
с промежуточным представлением
define double @test2(double %x) {
entry:
%calltmp = call double @test(double %x)
%addtmp = fadd double %x, %calltmp
ret double %addtmp
}
Теперь если переопределить функцию def test(x) x
промежуточное представление которой
define double @test(double %x) {
entry:
ret double %x
}
То попытка выполнить test2(1) (которое по идеи должно вернуть 2, а до переопределения - 3)
приведет к "Ошибка сегментирования"
Куда копать?
Хочу организовать переопределение как в python и sbcl.