24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
return get< codegen::Address >( result );
}
else if constexpr( is_same_v< T, llvm::Value* > )
{
if( holds_alternative< codegen::Address >( result ) )
return AddressToGEP( builder, get< codegen::Address >( result ) );
else
return get< llvm::Value* >( result );
}
else if( holds_alternative< llvm::Value* >( result ) )
return llvm::dyn_cast_or_null< remove_pointer_t< T > >( get< llvm::Value* >( result ) );
return nullopt;
}
optional< Slot > pop()
{
if( m_stack.empty() )
|
|
|
|
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
return get< codegen::Address >( result );
}
else if constexpr( is_same_v< T, llvm::Value* > )
{
if( holds_alternative< codegen::Address >( result ) )
return AddressToGEP( builder, get< codegen::Address >( result ) );
else
return InsertLoadIfNeeded( builder, get< llvm::Value* >( result ) );
}
else if( holds_alternative< llvm::Value* >( result ) )
return llvm::dyn_cast_or_null< remove_pointer_t< T > >( InsertLoadIfNeeded( builder, get< llvm::Value* >( result ) ) );
return nullopt;
}
optional< Slot > pop()
{
if( m_stack.empty() )
|
49
50
51
52
53
54
55
56
57
58
59
60
|
template< typename T >
void push( T&& v )
{
m_stack.push( forward< T >( v ) );
}
private:
stack< Slot > m_stack;
};
}
#endif
|
>
>
>
>
>
>
>
|
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
template< typename T >
void push( T&& v )
{
m_stack.push( forward< T >( v ) );
}
private:
static llvm::Value* InsertLoadIfNeeded( llvm::IRBuilder<>& builder, llvm::Value* lv )
{
if( llvm::isa< llvm::AllocaInst >( lv ) )
return builder.CreateLoad( llvm::cast< llvm::AllocaInst >( lv )->getAllocatedType(), lv );
return lv;
}
stack< Slot > m_stack;
};
}
#endif
|