CodeGenFunction.h revision 2621fd1d6d3c5eadcae246859f62738645df7540
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- CodeGenFunction.h - Per-Function state for LLVM CodeGen ----------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This is the internal per-function state used for llvm translation.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
14ef52a2fb2ace36c92f88c6e125bd7defa17dafa5Chris Lattner#ifndef CLANG_CODEGEN_CODEGENFUNCTION_H
15ef52a2fb2ace36c92f88c6e125bd7defa17dafa5Chris Lattner#define CLANG_CODEGEN_CODEGENFUNCTION_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
17391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner#include "clang/AST/Type.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/DenseMap.h"
19da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner#include "llvm/ADT/SmallVector.h"
2050b36741673258aaebcd3c7fe1260031901cae57Chris Lattner#include "llvm/Support/IRBuilder.h"
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <vector>
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace llvm {
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Module;
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class ASTContext;
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Decl;
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class FunctionDecl;
31391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  class ObjCMethodDecl;
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class TargetInfo;
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class FunctionTypeProto;
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Stmt;
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class CompoundStmt;
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class LabelStmt;
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class GotoStmt;
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class IfStmt;
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class WhileStmt;
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class DoStmt;
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class ForStmt;
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class ReturnStmt;
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class DeclStmt;
4551b09f2c528c8460b5465c676173324e44176d62Devang Patel  class CaseStmt;
4651b09f2c528c8460b5465c676173324e44176d62Devang Patel  class DefaultStmt;
4751b09f2c528c8460b5465c676173324e44176d62Devang Patel  class SwitchStmt;
48fb1aeb804c08d5288a923fb278161783e6abdc66Anders Carlsson  class AsmStmt;
49fb1aeb804c08d5288a923fb278161783e6abdc66Anders Carlsson
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class Expr;
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class DeclRefExpr;
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class StringLiteral;
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class IntegerLiteral;
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class FloatingLiteral;
55b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  class CharacterLiteral;
5630bf3ae03f2edd9474d1ad69e7af64613367fed2Chris Lattner  class TypesCompatibleExpr;
5730bf3ae03f2edd9474d1ad69e7af64613367fed2Chris Lattner
587016a706c9fab0d7c1603e424c61abbff9077037Chris Lattner  class ImplicitCastExpr;
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class CastExpr;
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class CallExpr;
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class UnaryOperator;
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class BinaryOperator;
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class CompoundAssignOperator;
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class ArraySubscriptExpr;
65213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  class ExtVectorElementExpr;
66b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  class ConditionalOperator;
6794f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  class ChooseExpr;
68227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  class PreDefinedExpr;
695508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  class ObjCStringLiteral;
70391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  class ObjCIvarRefExpr;
71b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel  class MemberExpr;
72b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel
73248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff  class VarDecl;
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class EnumConstantDecl;
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class ParmVarDecl;
76472778eb4fce241721c563280886e98389bc7219Eli Friedman  class FieldDecl;
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace CodeGen {
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  class CodeGenModule;
79b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel  class CodeGenTypes;
8088a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel  class CGRecordLayout;
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// RValue - This trivial value class is used to represent the result of an
839b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner/// expression that is evaluated.  It can be one of three things: either a
849b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner/// simple LLVM SSA value, a pair of SSA values for complex numbers, or the
859b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner/// address of an aggregate value in memory.
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass RValue {
879b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  llvm::Value *V1, *V2;
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // TODO: Encode this into the low bit of pointer for more efficient
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // return-by-value.
909b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  enum { Scalar, Complex, Aggregate } Flavor;
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: Aggregate rvalues need to retain information about whether they are
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // volatile or not.
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
969b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  bool isScalar() const { return Flavor == Scalar; }
979b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  bool isComplex() const { return Flavor == Complex; }
989b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  bool isAggregate() const { return Flavor == Aggregate; }
995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1009b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  /// getScalar() - Return the Value* of this scalar value.
1019b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  llvm::Value *getScalarVal() const {
1029b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    assert(isScalar() && "Not a scalar!");
1039b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return V1;
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1069b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  /// getComplexVal - Return the real/imag components of this complex value.
1079b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  ///
1089b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  std::pair<llvm::Value *, llvm::Value *> getComplexVal() const {
1099b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return std::pair<llvm::Value *, llvm::Value *>(V1, V2);
1109b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  }
1119b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getAggregateAddr() - Return the Value* of the address of the aggregate.
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Value *getAggregateAddr() const {
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    assert(isAggregate() && "Not an aggregate!");
1159b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return V1;
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static RValue get(llvm::Value *V) {
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    RValue ER;
1209b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.V1 = V;
1219b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.Flavor = Scalar;
1229b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return ER;
1239b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  }
1249b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  static RValue getComplex(llvm::Value *V1, llvm::Value *V2) {
1259b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    RValue ER;
1269b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.V1 = V1;
1279b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.V2 = V2;
1289b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.Flavor = Complex;
1299b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    return ER;
1309b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  }
1319b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  static RValue getComplex(const std::pair<llvm::Value *, llvm::Value *> &C) {
1329b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    RValue ER;
1339b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.V1 = C.first;
1349b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.V2 = C.second;
1359b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.Flavor = Complex;
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ER;
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static RValue getAggregate(llvm::Value *V) {
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    RValue ER;
1409b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.V1 = V;
1419b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner    ER.Flavor = Aggregate;
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return ER;
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// LValue - This represents an lvalue references.  Because C/C++ allow
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// bitfields, this is not a simple LLVM pointer, it may be a pointer plus a
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// bitrange.
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass LValue {
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: Volatility.  Restrict?
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // alignment?
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  enum {
155349aaec106b459206479f7600990230b9d799c61Chris Lattner    Simple,       // This is a normal l-value, use getAddress().
156349aaec106b459206479f7600990230b9d799c61Chris Lattner    VectorElt,    // This is a vector element l-value (V[i]), use getVector*
157349aaec106b459206479f7600990230b9d799c61Chris Lattner    BitField,     // This is a bitfield l-value, use getBitfield*.
158213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    ExtVectorElt  // This is an extended vector subset, use getExtVectorComp
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } LVType;
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Value *V;
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  union {
164349aaec106b459206479f7600990230b9d799c61Chris Lattner    llvm::Value *VectorIdx;   // Index into a vector subscript: V[i]
165213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    unsigned VectorElts;      // Encoded ExtVector element subset: V.xyx
1663b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    struct {
1673b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio      unsigned short StartBit;
1683b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio      unsigned short Size;
1693b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio      bool IsSigned;
1703b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    } BitfieldData;           // BitField start bit and size
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isSimple() const { return LVType == Simple; }
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isVectorElt() const { return LVType == VectorElt; }
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isBitfield() const { return LVType == BitField; }
176213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  bool isExtVectorElt() const { return LVType == ExtVectorElt; }
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // simple lvalue
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Value *getAddress() const { assert(isSimple()); return V; }
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // vector elt lvalue
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Value *getVectorAddr() const { assert(isVectorElt()); return V; }
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Value *getVectorIdx() const { assert(isVectorElt()); return VectorIdx; }
183213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // extended vector elements.
184213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  llvm::Value *getExtVectorAddr() const { assert(isExtVectorElt()); return V; }
185213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  unsigned getExtVectorElts() const {
186213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    assert(isExtVectorElt());
1876481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner    return VectorElts;
188349aaec106b459206479f7600990230b9d799c61Chris Lattner  }
1893b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  // bitfield lvalue
1903b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  llvm::Value *getBitfieldAddr() const { assert(isBitfield()); return V; }
1913b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  unsigned short getBitfieldStartBit() const {
1923b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    assert(isBitfield());
1933b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    return BitfieldData.StartBit;
1943b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  }
1953b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  unsigned short getBitfieldSize() const {
1963b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    assert(isBitfield());
1973b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    return BitfieldData.Size;
1983b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  }
1993b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  bool isBitfieldSigned() const {
2003b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    assert(isBitfield());
2013b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    return BitfieldData.IsSigned;
2023b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  }
2033b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static LValue MakeAddr(llvm::Value *V) {
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    LValue R;
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    R.LVType = Simple;
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    R.V = V;
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return R;
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static LValue MakeVectorElt(llvm::Value *Vec, llvm::Value *Idx) {
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    LValue R;
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    R.LVType = VectorElt;
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    R.V = Vec;
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    R.VectorIdx = Idx;
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return R;
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
219213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  static LValue MakeExtVectorElt(llvm::Value *Vec, unsigned Elements) {
220349aaec106b459206479f7600990230b9d799c61Chris Lattner    LValue R;
221213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    R.LVType = ExtVectorElt;
222349aaec106b459206479f7600990230b9d799c61Chris Lattner    R.V = Vec;
2236481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattner    R.VectorElts = Elements;
224349aaec106b459206479f7600990230b9d799c61Chris Lattner    return R;
225349aaec106b459206479f7600990230b9d799c61Chris Lattner  }
2263b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio
2273b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  static LValue MakeBitfield(llvm::Value *V, unsigned short StartBit,
2283b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio                             unsigned short Size, bool IsSigned) {
2293b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    LValue R;
2303b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    R.LVType = BitField;
2313b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    R.V = V;
2323b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    R.BitfieldData.StartBit = StartBit;
2333b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    R.BitfieldData.Size = Size;
2343b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    R.BitfieldData.IsSigned = IsSigned;
2353b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio    return R;
2363b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  }
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// CodeGenFunction - This class organizes the per-function state that is used
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// while generating LLVM code.
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass CodeGenFunction {
242bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattnerpublic:
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  CodeGenModule &CGM;  // Per-module state.
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TargetInfo &Target;
245bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner
24658dee10ed2eee34035f62d1c2d32b3639e9182f8Chris Lattner  typedef std::pair<llvm::Value *, llvm::Value *> ComplexPairTy;
24750b36741673258aaebcd3c7fe1260031901cae57Chris Lattner  llvm::IRBuilder Builder;
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
249c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner  // Holds the Decl for the current function or method
250c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner  const Decl *CurFuncDecl;
251391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  QualType FnRetTy;
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Function *CurFn;
2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// AllocaInsertPoint - This is an instruction in the entry block before which
2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// we prefer to insert allocas.
2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Instruction *AllocaInsertPt;
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const llvm::Type *LLVMIntTy;
2597b66000bdfc2684351fb03208e672f23012ed569Hartmut Kaiser  uint32_t LLVMPointerWidth;
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattnerprivate:
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// LocalDeclMap - This keeps track of the LLVM allocas or globals for local C
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// decls.
2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::DenseMap<const Decl*, llvm::Value*> LocalDeclMap;
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// LabelMap - This keeps track of the LLVM basic block for each C label.
2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::DenseMap<const LabelStmt*, llvm::BasicBlock*> LabelMap;
268da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner
269da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner  // BreakContinueStack - This keeps track of where break and continue
270da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner  // statements should jump to.
271da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner  struct BreakContinue {
272da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner    BreakContinue(llvm::BasicBlock *bb, llvm::BasicBlock *cb)
273da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner      : BreakBlock(bb), ContinueBlock(cb) {}
274da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner
275da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner    llvm::BasicBlock *BreakBlock;
276da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner    llvm::BasicBlock *ContinueBlock;
277da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner  };
278da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner  llvm::SmallVector<BreakContinue, 8> BreakContinueStack;
279da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner
28080fd5f96e6805ac43aab99faabd5b4c8b19551b7Devang Patel  /// SwitchInsn - This is nearest current switch instruction. It is null if
28180fd5f96e6805ac43aab99faabd5b4c8b19551b7Devang Patel  /// if current context is not in a switch.
28251b09f2c528c8460b5465c676173324e44176d62Devang Patel  llvm::SwitchInst *SwitchInsn;
28351b09f2c528c8460b5465c676173324e44176d62Devang Patel
28480fd5f96e6805ac43aab99faabd5b4c8b19551b7Devang Patel  /// CaseRangeBlock - This block holds if condition check for last case
28580fd5f96e6805ac43aab99faabd5b4c8b19551b7Devang Patel  /// statement range in current switch instruction.
286c049e4f406a7f7179eba98659044a32508e53289Devang Patel  llvm::BasicBlock *CaseRangeBlock;
287c049e4f406a7f7179eba98659044a32508e53289Devang Patel
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
2895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  CodeGenFunction(CodeGenModule &cgm);
2905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ASTContext &getContext() const;
2925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
293391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  void GenerateObjCMethod(const ObjCMethodDecl *OMD);
2945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void GenerateCode(const FunctionDecl *FD);
2955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const llvm::Type *ConvertType(QualType T);
297c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner
298c8aa5f1f264fb230c38182adab944232bb160c2bChris Lattner  llvm::Value *LoadObjCSelf();
2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// hasAggregateLLVMType - Return true if the specified AST type will map into
3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// an aggregate LLVM type or is void.
3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  static bool hasAggregateLLVMType(QualType T);
3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getBasicBlockForLabel - Return the LLVM basicblock that the specified
3055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// label maps to.
3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::BasicBlock *getBasicBlockForLabel(const LabelStmt *S);
3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitBlock(llvm::BasicBlock *BB);
310dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner
311dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner  /// WarnUnsupported - Print out a warning that codegen doesn't support the
312dc5e8268292046114ffe02e48773572a91a310f1Chris Lattner  /// specified stmt yet.
313dc4d280136d3301fcbf3c7b4b2782c8bd804342cChris Lattner  void WarnUnsupported(const Stmt *S, const char *Type);
3145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //                                  Helpers
3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// CreateTempAlloca - This creates a alloca and inserts it into the entry
3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// block.
3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::AllocaInst *CreateTempAlloca(const llvm::Type *Ty,
3225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                     const char *Name = "tmp");
3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// EvaluateExprAsBool - Perform the usual unary conversions on the specified
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// expression and compare the result against zero, returning an Int1Ty value.
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  llvm::Value *EvaluateExprAsBool(const Expr *E);
3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3289b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  /// EmitAnyExpr - Emit code to compute the specified expression which can have
3299b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  /// any type.  The result is returned as an RValue struct.  If this is an
3309b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  /// aggregate expression, the aggloc/agglocvolatile arguments indicate where
3319b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  /// the result should be returned.
3329b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  RValue EmitAnyExpr(const Expr *E, llvm::Value *AggLoc = 0,
3339b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner                     bool isAggLocVolatile = false);
334d9363c3a80168283b3da518b4e17f545a6246857Devang Patel
335d9363c3a80168283b3da518b4e17f545a6246857Devang Patel  /// isDummyBlock - Return true if BB is an empty basic block
336d9363c3a80168283b3da518b4e17f545a6246857Devang Patel  /// with no predecessors.
337d9363c3a80168283b3da518b4e17f545a6246857Devang Patel  static bool isDummyBlock(const llvm::BasicBlock *BB);
338d9363c3a80168283b3da518b4e17f545a6246857Devang Patel
33951b09f2c528c8460b5465c676173324e44176d62Devang Patel  /// StartBlock - Start new block named N. If insert block is a dummy block
34051b09f2c528c8460b5465c676173324e44176d62Devang Patel  /// then reuse it.
34151b09f2c528c8460b5465c676173324e44176d62Devang Patel  void StartBlock(const char *N);
34251b09f2c528c8460b5465c676173324e44176d62Devang Patel
34388a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel  /// getCGRecordLayout - Return record layout info.
34488a981b47c7face1b1fdaa9074256245107b9ca9Devang Patel  const CGRecordLayout *getCGRecordLayout(CodeGenTypes &CGT, QualType RTy);
345813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venancio
346813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venancio  /// GetAddrOfStaticLocalVar - Return the address of a static local variable.
347248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff  llvm::Constant *GetAddrOfStaticLocalVar(const VarDecl *BVD);
3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //                            Declaration Emission
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitDecl(const Decl &D);
3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitEnumConstantDecl(const EnumConstantDecl &D);
354248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff  void EmitBlockVarDecl(const VarDecl &D);
355248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff  void EmitLocalBlockVarDecl(const VarDecl &D);
356248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff  void EmitStaticBlockVarDecl(const VarDecl &D);
3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitParmDecl(const ParmVarDecl &D, llvm::Value *Arg);
3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //                             Statement Emission
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitStmt(const Stmt *S);
3649b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  RValue EmitCompoundStmt(const CompoundStmt &S, bool GetLast = false,
3659b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner                          llvm::Value *AggLoc = 0, bool isAggVol = false);
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitLabelStmt(const LabelStmt &S);
3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitGotoStmt(const GotoStmt &S);
3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitIfStmt(const IfStmt &S);
3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitWhileStmt(const WhileStmt &S);
3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitDoStmt(const DoStmt &S);
3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitForStmt(const ForStmt &S);
3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitReturnStmt(const ReturnStmt &S);
3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitDeclStmt(const DeclStmt &S);
374da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner  void EmitBreakStmt();
375da13870e99fe33934b2122f06528a5063f78ae4cChris Lattner  void EmitContinueStmt();
37651b09f2c528c8460b5465c676173324e44176d62Devang Patel  void EmitSwitchStmt(const SwitchStmt &S);
37751b09f2c528c8460b5465c676173324e44176d62Devang Patel  void EmitDefaultStmt(const DefaultStmt &S);
37851b09f2c528c8460b5465c676173324e44176d62Devang Patel  void EmitCaseStmt(const CaseStmt &S);
379c049e4f406a7f7179eba98659044a32508e53289Devang Patel  void EmitCaseStmtRange(const CaseStmt &S);
380fb1aeb804c08d5288a923fb278161783e6abdc66Anders Carlsson  void EmitAsmStmt(const AsmStmt &S);
381fb1aeb804c08d5288a923fb278161783e6abdc66Anders Carlsson
3825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //                         LValue Expression Emission
3845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
3855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// EmitLValue - Emit code to compute a designator that specifies the location
3875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// of the expression.
3885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
3895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// This can return one of two things: a simple address or a bitfield
3905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// reference.  In either case, the LLVM Value* in the LValue structure is
3915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// guaranteed to be an LLVM pointer type.
3925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
3935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// If this returns a bitfield reference, nothing about the pointee type of
3945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// the LLVM value is known: For example, it may not be a pointer to an
3955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// integer.
3965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
3975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// If this returns a normal address, and if the lvalue's C type is fixed
3985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// size, this method guarantees that the returned pointer type will point to
3995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// an LLVM type of the same size of the lvalue's type.  If the lvalue has a
4005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// variable length type, this is not possible.
4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LValue EmitLValue(const Expr *E);
4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// EmitLoadOfLValue - Given an expression that represents a value lvalue,
4055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// this method emits the address of the lvalue, then loads the result as an
4065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// rvalue, returning the rvalue.
4075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RValue EmitLoadOfLValue(LValue V, QualType LVType);
408213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  RValue EmitLoadOfExtVectorElementLValue(LValue V, QualType LVType);
4093b8c22d93da1432b2d4cea779d14912645c93866Lauro Ramos Venancio  RValue EmitLoadOfBitfieldLValue(LValue LV, QualType ExprType);
4105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
41134cdc86af5b0a54084a512a1b2643365b8f5bdd2Chris Lattner
4125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// EmitStoreThroughLValue - Store the specified rvalue into the specified
4135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// lvalue, where both are guaranteed to the have the same type, and that type
4145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// is 'Ty'.
4155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void EmitStoreThroughLValue(RValue Src, LValue Dst, QualType Ty);
416213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst,
417213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman                                                QualType Ty);
418a0c5d0eacede0f67ce46707263ddf4d8de0df706Lauro Ramos Venancio  void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst, QualType Ty);
41922c940ee588a420cd2e6c8f68be2ac3cc80061ffChristopher Lamb
42022c940ee588a420cd2e6c8f68be2ac3cc80061ffChristopher Lamb  // Note: only availabe for agg return types
42122c940ee588a420cd2e6c8f68be2ac3cc80061ffChristopher Lamb  LValue EmitCallExprLValue(const CallExpr *E);
4225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LValue EmitDeclRefLValue(const DeclRefExpr *E);
4245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LValue EmitStringLiteralLValue(const StringLiteral *E);
425227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  LValue EmitPreDefinedLValue(const PreDefinedExpr *E);
4265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LValue EmitUnaryOpLValue(const UnaryOperator *E);
4275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E);
428213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  LValue EmitExtVectorElementExpr(const ExtVectorElementExpr *E);
429b84a06e68ffd71da22e3c75b6e4bbdba37816413Devang Patel  LValue EmitMemberExpr(const MemberExpr *E);
430472778eb4fce241721c563280886e98389bc7219Eli Friedman
431472778eb4fce241721c563280886e98389bc7219Eli Friedman  LValue EmitLValueForField(llvm::Value* Base, FieldDecl* Field,
432472778eb4fce241721c563280886e98389bc7219Eli Friedman                            bool isUnion);
433391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner
434391d77a26382dddf25da73e29fc1fa5aaaea4c6fChris Lattner  LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E);
4355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
436883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner  //                         Scalar Expression Emission
4375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  //===--------------------------------------------------------------------===//
4385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  RValue EmitCallExpr(const CallExpr *E);
4405193b8a3e57c4f696161aeddfe8227c294c0a7feEli Friedman  RValue EmitCallExpr(Expr *FnExpr, Expr *const *Args, unsigned NumArgs);
4415193b8a3e57c4f696161aeddfe8227c294c0a7feEli Friedman  RValue EmitCallExpr(llvm::Value *Callee, QualType FnType,
4425193b8a3e57c4f696161aeddfe8227c294c0a7feEli Friedman                      Expr *const *Args, unsigned NumArgs);
4431e4d21ea5849637c49fd4222b09c4b5dedff7765Chris Lattner  RValue EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
4445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
445564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  llvm::Value *EmitX86BuiltinExpr(unsigned BuiltinID, const CallExpr *E);
446564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson  llvm::Value *EmitPPCBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
447564f1de67d7ba43646b8740db86d6269e3dfbe0bAnders Carlsson
448cc23acae84c6d5c37b4805edbcd95ee5d821c400Anders Carlsson  llvm::Value *EmitShuffleVector(llvm::Value* V1, llvm::Value *V2, ...);
4494119d1aeca8016654d381ce079864058d1709571Nate Begeman  llvm::Value *EmitVector(llvm::Value * const *Vals, unsigned NumVals,
4504119d1aeca8016654d381ce079864058d1709571Nate Begeman                          bool isSplat = false);
4516086bbd1799e22e75561c3d31dc9b923f0508fa5Anders Carlsson
4527f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E);
4535508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
454883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner  //===--------------------------------------------------------------------===//
455bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner  //                           Expression Emission
456883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner  //===--------------------------------------------------------------------===//
457bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner
458bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner  // Expressions are broken into three classes: scalar, complex, aggregate.
459883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner
4607f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// EmitScalarExpr - Emit the computation of the specified expression of
4617f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  /// LLVM scalar type, returning the result.
4627f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner  llvm::Value *EmitScalarExpr(const Expr *E);
4637f02f721d48772e4eee4fccd8af4f800be1bbc1eChris Lattner
4643707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  /// EmitScalarConversion - Emit a conversion from the specified type to the
4653707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  /// specified destination type, both of which are LLVM scalar types.
4663707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner  llvm::Value *EmitScalarConversion(llvm::Value *Src, QualType SrcTy,
4673707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner                                    QualType DstTy);
4683707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
4694f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  /// EmitComplexToScalarConversion - Emit a conversion from the specified
4704f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  /// complex type to the specified destination type, where the destination
4714f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  /// type is an LLVM scalar type.
4724f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner  llvm::Value *EmitComplexToScalarConversion(ComplexPairTy Src, QualType SrcTy,
4734f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner                                             QualType DstTy);
4744f1a7b380809b4ca19ad2daff61bc11cd1e979d8Chris Lattner
4753707b255f8993fb362904c9cff87b0e9bc6ca317Chris Lattner
476883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner  /// EmitAggExpr - Emit the computation of the specified expression of
477883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner  /// aggregate type.  The result is computed into DestPtr.  Note that if
478883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner  /// DestPtr is null, the value of the aggregate expression is not needed.
479883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner  void EmitAggExpr(const Expr *E, llvm::Value *DestPtr, bool VolatileDest);
480b6ef18a2b06d6760459e1756a61f79ff496cee19Chris Lattner
481b6ef18a2b06d6760459e1756a61f79ff496cee19Chris Lattner  /// EmitComplexExpr - Emit the computation of the specified expression of
48223b1cdb0b5e089468bb8475b8ec9287af67b4b59Chris Lattner  /// complex type, returning the result.
48358dee10ed2eee34035f62d1c2d32b3639e9182f8Chris Lattner  ComplexPairTy EmitComplexExpr(const Expr *E);
48423b1cdb0b5e089468bb8475b8ec9287af67b4b59Chris Lattner
48523b1cdb0b5e089468bb8475b8ec9287af67b4b59Chris Lattner  /// EmitComplexExprIntoAddr - Emit the computation of the specified expression
48623b1cdb0b5e089468bb8475b8ec9287af67b4b59Chris Lattner  /// of complex type, storing into the specified Value*.
487190dbe203c2e892ac40f1786035c6c9be3f44a4cChris Lattner  void EmitComplexExprIntoAddr(const Expr *E, llvm::Value *DestAddr,
488190dbe203c2e892ac40f1786035c6c9be3f44a4cChris Lattner                               bool DestIsVolatile);
4899b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  /// LoadComplexFromAddr - Load a complex number from the specified address.
4909b65551d0b387a7597fb39356a4d8ef10046445eChris Lattner  ComplexPairTy LoadComplexFromAddr(llvm::Value *SrcAddr, bool SrcIsVolatile);
4912621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner
4922621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner  /// GenerateStaticBlockVarDecl - return the the static
4932621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner  /// declaration of local variable.
4942621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner  llvm::GlobalValue *GenerateStaticBlockVarDecl(const VarDecl &D,
4952621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner                                                bool NoInit,
4962621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner                                                const char *Separator);
4975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
4985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace CodeGen
4995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
5005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
502