mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-04-29 14:40:40 +03:00
152 lines
4.2 KiB
C++
152 lines
4.2 KiB
C++
//===-- irvar.cpp ---------------------------------------------------------===//
|
||
//
|
||
// LDC – the LLVM D compiler
|
||
//
|
||
// This file is distributed under the BSD-style LDC license. See the LICENSE
|
||
// file for details.
|
||
//
|
||
//===----------------------------------------------------------------------===//
|
||
|
||
#include "gen/llvm.h"
|
||
#include "declaration.h"
|
||
#include "gen/irstate.h"
|
||
#include "ir/irdsymbol.h"
|
||
#include "ir/irvar.h"
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|
||
IrField::IrField(VarDeclaration* v) : IrVar(v)
|
||
{
|
||
if (v->aggrIndex)
|
||
{
|
||
index = v->aggrIndex;
|
||
unionOffset = 0;
|
||
}
|
||
else
|
||
{
|
||
index = 0;
|
||
unionOffset = v->offset;
|
||
}
|
||
}
|
||
|
||
extern LLConstant* get_default_initializer(VarDeclaration* vd, Initializer* init);
|
||
|
||
llvm::Constant* IrField::getDefaultInit()
|
||
{
|
||
if (constInit)
|
||
return constInit;
|
||
constInit = get_default_initializer(V, V->init);
|
||
return constInit;
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|
||
IrVar *getIrVar(VarDeclaration *decl)
|
||
{
|
||
assert(isIrVarCreated(decl));
|
||
assert(decl->ir.irVar != NULL);
|
||
return decl->ir.irVar;
|
||
}
|
||
|
||
llvm::Value *getIrValue(VarDeclaration *decl)
|
||
{
|
||
return getIrVar(decl)->value;
|
||
}
|
||
|
||
bool isIrVarCreated(VarDeclaration *decl)
|
||
{
|
||
int t = decl->ir.type();
|
||
bool isIrVar = t == IrDsymbol::GlobalType ||
|
||
t == IrDsymbol::LocalType ||
|
||
t == IrDsymbol::ParamterType ||
|
||
t == IrDsymbol::FieldType;
|
||
assert(isIrVar || t == IrDsymbol::NotSet);
|
||
return isIrVar;
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|
||
IrGlobal *getIrGlobal(VarDeclaration *decl, bool create)
|
||
{
|
||
if (!isIrGlobalCreated(decl) && create)
|
||
{
|
||
assert(decl->ir.irGlobal == NULL);
|
||
decl->ir.irGlobal = new IrGlobal(decl);
|
||
decl->ir.m_type = IrDsymbol::GlobalType;
|
||
}
|
||
assert(decl->ir.irGlobal != NULL);
|
||
return decl->ir.irGlobal;
|
||
}
|
||
|
||
bool isIrGlobalCreated(VarDeclaration *decl)
|
||
{
|
||
int t = decl->ir.type();
|
||
assert(t == IrDsymbol::GlobalType || t == IrDsymbol::NotSet);
|
||
return t == IrDsymbol::GlobalType;
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|
||
IrLocal *getIrLocal(VarDeclaration *decl, bool create)
|
||
{
|
||
if (!isIrLocalCreated(decl) && create)
|
||
{
|
||
assert(decl->ir.irLocal == NULL);
|
||
decl->ir.irLocal = new IrLocal(decl);
|
||
decl->ir.m_type = IrDsymbol::LocalType;
|
||
}
|
||
assert(decl->ir.irLocal != NULL);
|
||
return decl->ir.irLocal;
|
||
}
|
||
|
||
bool isIrLocalCreated(VarDeclaration *decl)
|
||
{
|
||
int t = decl->ir.type();
|
||
assert(t == IrDsymbol::LocalType || t == IrDsymbol::ParamterType || t == IrDsymbol::NotSet);
|
||
return t == IrDsymbol::LocalType || t == IrDsymbol::ParamterType;
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|
||
IrParameter *getIrParameter(VarDeclaration *decl, bool create)
|
||
{
|
||
if (!isIrParameterCreated(decl) && create)
|
||
{
|
||
assert(decl->ir.irParam == NULL);
|
||
decl->ir.irParam = new IrParameter(decl);
|
||
decl->ir.m_type = IrDsymbol::ParamterType;
|
||
}
|
||
return decl->ir.irParam;
|
||
}
|
||
|
||
bool isIrParameterCreated(VarDeclaration *decl)
|
||
{
|
||
int t = decl->ir.type();
|
||
assert(t == IrDsymbol::ParamterType || t == IrDsymbol::NotSet);
|
||
return t == IrDsymbol::ParamterType;
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
|
||
IrField *getIrField(VarDeclaration *decl, bool create)
|
||
{
|
||
if (!isIrFieldCreated(decl) && create)
|
||
{
|
||
assert(decl->ir.irField == NULL);
|
||
decl->ir.irField = new IrField(decl);
|
||
decl->ir.m_type = IrDsymbol::FieldType;
|
||
}
|
||
assert(decl->ir.irField != NULL);
|
||
return decl->ir.irField;
|
||
}
|
||
|
||
bool isIrFieldCreated(VarDeclaration *decl)
|
||
{
|
||
int t = decl->ir.type();
|
||
assert(t == IrDsymbol::FieldType || t == IrDsymbol::NotSet);
|
||
return t == IrDsymbol::FieldType;
|
||
}
|