ldc/gen/arrays.h
2019-04-23 22:13:13 +02:00

89 lines
3.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//===-- gen/arrays.h - D array codegen helpers ------------------*- C++ -*-===//
//
// LDC the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
//
// Helper functions for manipulating D dynamic array (slice) types/values.
//
//===----------------------------------------------------------------------===//
#pragma once
#include "dmd/tokens.h"
#include "gen/llvm.h"
class ArrayInitializer;
class ArrayLiteralExp;
class DSliceValue;
class DValue;
class Expression;
struct IRState;
struct Loc;
class Type;
llvm::StructType *DtoArrayType(Type *arrayTy);
llvm::StructType *DtoArrayType(LLType *elemTy);
llvm::ArrayType *DtoStaticArrayType(Type *sarrayTy);
/// Creates a (global) constant with the element data for the given arary
/// initializer. targetType is explicit because the frontend sometimes emits
/// ArrayInitializers for vectors typed as static arrays.
LLConstant *DtoConstArrayInitializer(ArrayInitializer *si, Type *targetType);
LLConstant *DtoConstSlice(LLConstant *dim, LLConstant *ptr,
Type *type = nullptr);
/// Returns the element at position idx of the literal (assumed to be in range).
Expression *indexArrayLiteral(ArrayLiteralExp *ale, unsigned idx);
/// Returns whether the array literal can be evaluated to a (LLVM) constant.
/// immutableType indicates whether the literal is used to initialize an
/// immutable type, in which case allocated dynamic arrays are considered
/// constant too.
bool isConstLiteral(Expression *e, bool immutableType = false);
/// Returns the constant for the given array literal expression.
llvm::Constant *arrayLiteralToConst(IRState *p, ArrayLiteralExp *ale);
/// Initializes a chunk of memory with the contents of an array literal.
///
/// dstMem is expected to be a pointer to the array allocation.
void initializeArrayLiteral(IRState *p, ArrayLiteralExp *ale, LLValue *dstMem);
void DtoArrayAssign(Loc &loc, DValue *lhs, DValue *rhs, int op,
bool canSkipPostblit);
void DtoSetArrayToNull(LLValue *v);
DSliceValue *DtoNewDynArray(Loc &loc, Type *arrayType, DValue *dim,
bool defaultInit = true);
DSliceValue *DtoNewMulDimDynArray(Loc &loc, Type *arrayType, DValue **dims,
size_t ndims);
DSliceValue *DtoResizeDynArray(Loc &loc, Type *arrayType, DValue *array,
llvm::Value *newdim);
void DtoCatAssignElement(Loc &loc, DValue *arr, Expression *exp);
DSliceValue *DtoCatAssignArray(Loc &loc, DValue *arr, Expression *exp);
DSliceValue *DtoCatArrays(Loc &loc, Type *type, Expression *e1, Expression *e2);
DSliceValue *DtoAppendDCharToString(Loc &loc, DValue *arr, Expression *exp);
DSliceValue *DtoAppendDCharToUnicodeString(Loc &loc, DValue *arr,
Expression *exp);
LLValue *DtoArrayEquals(Loc &loc, TOK op, DValue *l, DValue *r);
LLValue *DtoDynArrayIs(TOK op, DValue *l, DValue *r);
LLValue *DtoArrayLen(DValue *v);
LLValue *DtoArrayPtr(DValue *v);
DValue *DtoCastArray(Loc &loc, DValue *val, Type *to);
// generates an array bounds check
void DtoIndexBoundsCheck(Loc &loc, DValue *arr, DValue *index);
/// Inserts a call to the druntime function that throws the range error, with
/// the given location.
void DtoBoundsCheckFailCall(IRState *p, Loc &loc);