Files
swift-mirror/lib/IRGen/GenConstant.h
Erik Eckstein fe367e8013 Optimizer/IRGen: allow enums in static initializers of globals
The main change here is in IRGen which needs to be able to emit constant enum values.
Use `emitValueInjection` to create the enum constant.
Usually this method creates code in the current function.
But if all arguments to the enum are constant, the builder never has to emit an instruction.
Instead it can constant fold everything and just returns the final constant.

Also, create statically initialized let-globals as constant global (`constant` instead of `global`).
2023-05-25 16:28:41 +02:00

52 lines
1.8 KiB
C++

//===--- GenConstant.h - Swift IR Generation For Constants ------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This file implements IR generation for constant values.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_IRGEN_GENCONSTANT_H
#define SWIFT_IRGEN_GENCONSTANT_H
#include "llvm/IR/Constant.h"
#include "IRGenModule.h"
namespace swift {
namespace irgen {
/// Construct a ConstantInt from an IntegerLiteralInst.
llvm::Constant *emitConstantInt(IRGenModule &IGM, IntegerLiteralInst *ILI);
/// Construct a zero from a zero initializer BuiltinInst.
llvm::Constant *emitConstantZero(IRGenModule &IGM, BuiltinInst *Bi);
/// Construct a ConstantFP from a FloatLiteralInst.
llvm::Constant *emitConstantFP(IRGenModule &IGM, FloatLiteralInst *FLI);
/// Construct a pointer to a string from a StringLiteralInst.
llvm::Constant *emitAddrOfConstantString(IRGenModule &IGM,
StringLiteralInst *SLI);
/// Construct a constant from a SILValue containing constant values.
Explosion emitConstantValue(IRGenModule &IGM, SILValue value,
bool flatten = false);
/// Construct an object (with a HeapObject header) from an ObjectInst
/// containing constant values.
llvm::Constant *emitConstantObject(IRGenModule &IGM, ObjectInst *OI,
StructLayout *ClassLayout);
}
}
#endif