Пример #1
0
bool
destruct_(Context *ctx, ParseResult *pr, ParseResult *ret_pr,
          llvm::IRBuilder<> *builder, bool value_is_ptr)
{
    pr->copyTo(ret_pr);

    if (pr->do_not_destruct) {
        return true;
    }

    if (pr->type->is_array && pr->type->array_size) {
        return destructArray(ctx, pr, ret_pr, builder, value_is_ptr);
    }

    Function *fn = getDestructor(ctx, pr->type);
    if (!fn) {
        if (pr->type->struct_name.size()) {
            destructStruct(ctx, pr, ret_pr, builder, value_is_ptr);
        }
        return true;
    }

    std::vector<llvm::Value *> call_args;
    llvm::Value *value_ptr;
    if (value_is_ptr) {
        value_ptr = pr->value;
    } else {
        value_ptr = llvm::cast<llvm::Value>(
            builder->CreateAlloca(ctx->toLLVMType(pr->type, NULL, false))
        );
        builder->CreateStore(pr->value, value_ptr);
    }

    call_args.push_back(value_ptr);
    builder->CreateCall(
        fn->llvm_function,
        llvm::ArrayRef<llvm::Value*>(call_args)
    );

    return true;
}
Пример #2
0
void ArrayValueType::generateDestructor(Builder *builder, const Value &value) {
    if (value.isReference() || value.isConstant()) return;
    destructArray(builder, value.value());
}