mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-02 16:11:08 +03:00
93 lines
2.5 KiB
C++
93 lines
2.5 KiB
C++
//===-- dvalue.cpp --------------------------------------------------------===//
|
||
//
|
||
// LDC – the LLVM D compiler
|
||
//
|
||
// This file is distributed under the BSD-style LDC license. See the LICENSE
|
||
// file for details.
|
||
//
|
||
//===----------------------------------------------------------------------===//
|
||
|
||
#include "gen/dvalue.h"
|
||
#include "declaration.h"
|
||
#include "gen/irstate.h"
|
||
#include "gen/llvm.h"
|
||
#include "gen/llvmhelpers.h"
|
||
#include "gen/logger.h"
|
||
#include "gen/tollvm.h"
|
||
|
||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
DVarValue::DVarValue(Type* t, VarDeclaration* vd, LLValue* llvmValue)
|
||
: DValue(t), var(vd), val(llvmValue)
|
||
{
|
||
assert(isaPointer(llvmValue));
|
||
assert(!isSpecialRefVar(vd) ||
|
||
isaPointer(isaPointer(llvmValue)->getElementType()));
|
||
}
|
||
|
||
DVarValue::DVarValue(Type* t, LLValue* llvmValue)
|
||
: DValue(t), var(0), val(llvmValue)
|
||
{
|
||
assert(isaPointer(llvmValue));
|
||
}
|
||
|
||
LLValue* DVarValue::getLVal()
|
||
{
|
||
assert(val);
|
||
if (var && isSpecialRefVar(var))
|
||
return DtoLoad(val);
|
||
return val;
|
||
}
|
||
|
||
LLValue* DVarValue::getRVal()
|
||
{
|
||
assert(val);
|
||
|
||
llvm::Value* storage = val;
|
||
if (var && isSpecialRefVar(var))
|
||
storage = DtoLoad(storage);
|
||
|
||
if (DtoIsPassedByRef(type->toBasetype()))
|
||
return storage;
|
||
return DtoLoad(storage);
|
||
}
|
||
|
||
LLValue* DVarValue::getRefStorage()
|
||
{
|
||
assert(val);
|
||
assert(isSpecialRefVar(var));
|
||
return val;
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
LLValue* DSliceValue::getRVal()
|
||
{
|
||
assert(len);
|
||
assert(ptr);
|
||
return DtoAggrPair(len, ptr);
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
DFuncValue::DFuncValue(FuncDeclaration* fd, LLValue* v, LLValue* vt)
|
||
: DValue(fd->type), func(fd), val(v), vthis(vt)
|
||
{}
|
||
|
||
LLValue* DFuncValue::getRVal()
|
||
{
|
||
assert(val);
|
||
return val;
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
LLValue* DConstValue::getRVal()
|
||
{
|
||
assert(c);
|
||
return c;
|
||
}
|