19eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar//===----- ABIInfo.h - ABI information access & encapsulation ---*- C++ -*-===//
29eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar//
39eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar//                     The LLVM Compiler Infrastructure
49eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar//
59eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar// This file is distributed under the University of Illinois Open Source
69eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar// License. See LICENSE.TXT for details.
79eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar//
89eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar//===----------------------------------------------------------------------===//
99eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
109eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar#ifndef CLANG_CODEGEN_ABIINFO_H
119eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar#define CLANG_CODEGEN_ABIINFO_H
129eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
13c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov#include "clang/AST/Type.h"
143b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Type.h"
15bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall#include "llvm/IR/CallingConv.h"
16c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov
1788c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbarnamespace llvm {
18c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov  class Value;
19f21efe9088a0b3eda1209d1706529f6cb2073092Benjamin Kramer  class LLVMContext;
2025a6a84cf5067b32c271e3ba078676dee838798dMicah Villmow  class DataLayout;
2188c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar}
2288c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
239eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbarnamespace clang {
246bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  class ASTContext;
2564aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall  class TargetInfo;
266bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar
276bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  namespace CodeGen {
286bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar    class CGFunctionInfo;
29b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar    class CodeGenFunction;
30ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner    class CodeGenTypes;
316bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar  }
326bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar
332eb9cdd5922c6fe48af185bee1988dabb5bd644eChris Lattner  // FIXME: All of this stuff should be part of the target interface
342eb9cdd5922c6fe48af185bee1988dabb5bd644eChris Lattner  // somehow. It is currently here because it is not clear how to factor
352eb9cdd5922c6fe48af185bee1988dabb5bd644eChris Lattner  // the targets to support this, since the Targets currently live in a
362eb9cdd5922c6fe48af185bee1988dabb5bd644eChris Lattner  // layer below types n'stuff.
379eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
389eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  /// ABIArgInfo - Helper class to encapsulate information about how a
399eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  /// specific C type should be passed to or returned from a function.
409eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  class ABIArgInfo {
419eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  public:
429eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    enum Kind {
43117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// Direct - Pass the argument directly using the normal converted LLVM
44117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// type, or by coercing to another specified type stored in
45117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// 'CoerceToType').  If an offset is specified (in UIntData), then the
46117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// argument passed is offset by some number of bytes in the memory
47f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka      /// representation. A dummy argument is emitted before the real argument
48f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka      /// if the specified type stored in "PaddingType" is not zero.
49117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      Direct,
50117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner
51117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// Extend - Valid only for integer argument types. Same as 'direct'
52117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// but also emit a zero/sign extension attribute.
53117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      Extend,
54117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner
55117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// Indirect - Pass the argument indirectly via a hidden pointer
56117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// with the specified alignment (0 indicates default alignment).
57117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      Indirect,
58117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner
59117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// Ignore - Ignore the argument (treat as void). Useful for void and
60117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// empty structs.
61117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      Ignore,
62117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner
63117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// Expand - Only valid for aggregate argument types. The structure should
64117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// be expanded into consecutive arguments for its constituent fields.
65117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// Currently expand is only allowed on structures whose fields
66117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      /// are all scalar types or are themselves expandable types.
67117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      Expand,
68c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov
690bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar      KindFirst=Direct, KindLast=Expand
709eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    };
71c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov
729eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  private:
739eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    Kind TheKind;
749cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner    llvm::Type *TypeData;
75e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola    llvm::Type *PaddingType;
769eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    unsigned UIntData;
77cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar    bool BoolData0;
78cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar    bool BoolData1;
79b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    bool InReg;
80e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola    bool PaddingInReg;
81c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov
82b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    ABIArgInfo(Kind K, llvm::Type *TD, unsigned UI, bool B0, bool B1, bool IR,
83e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola               bool PIR, llvm::Type* P)
84f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka      : TheKind(K), TypeData(TD), PaddingType(P), UIntData(UI), BoolData0(B0),
85e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola        BoolData1(B1), InReg(IR), PaddingInReg(PIR) {}
860a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson
879eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  public:
880bcc52114e37a8d152d9a05095ee7f7687c9aa94Daniel Dunbar    ABIArgInfo() : TheKind(Direct), TypeData(0), UIntData(0) {}
8988c2fa96be989571b4afb6229f0ef5a3ef4450cbDaniel Dunbar
90f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka    static ABIArgInfo getDirect(llvm::Type *T = 0, unsigned Offset = 0,
91f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka                                llvm::Type *Padding = 0) {
92e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola      return ABIArgInfo(Direct, T, Offset, false, false, false, false, Padding);
93b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    }
940b4cc950c54c8dd2de51587ef48446de670fa012Rafael Espindola    static ABIArgInfo getDirectInReg(llvm::Type *T = 0) {
95e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola      return ABIArgInfo(Direct, T, 0, false, false, true, false, 0);
9646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    }
979cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner    static ABIArgInfo getExtend(llvm::Type *T = 0) {
98e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola      return ABIArgInfo(Extend, T, 0, false, false, false, false, 0);
99b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    }
100b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    static ABIArgInfo getExtendInReg(llvm::Type *T = 0) {
101e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola      return ABIArgInfo(Extend, T, 0, false, false, true, false, 0);
102cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    }
1039eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    static ABIArgInfo getIgnore() {
104e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola      return ABIArgInfo(Ignore, 0, 0, false, false, false, false, 0);
1059eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    }
106cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar    static ABIArgInfo getIndirect(unsigned Alignment, bool ByVal = true
107c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                  , bool Realign = false
108c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                                  , llvm::Type *Padding = 0) {
109c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover      return ABIArgInfo(Indirect, 0, Alignment, ByVal, Realign, false, false,
110c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover                        Padding);
111b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    }
112b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    static ABIArgInfo getIndirectInReg(unsigned Alignment, bool ByVal = true
113b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola                                  , bool Realign = false) {
114e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola      return ABIArgInfo(Indirect, 0, Alignment, ByVal, Realign, true, false, 0);
1159eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    }
1169eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    static ABIArgInfo getExpand() {
117e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola      return ABIArgInfo(Expand, 0, 0, false, false, false, false, 0);
118e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola    }
119e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola    static ABIArgInfo getExpandWithPadding(bool PaddingInReg,
120e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola                                           llvm::Type *Padding) {
121e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola     return ABIArgInfo(Expand, 0, 0, false, false, false, PaddingInReg,
122e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola                       Padding);
1239eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    }
124c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov
1259eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    Kind getKind() const { return TheKind; }
12646327aaf031529be2cf8bb21bc76d7a5ae0d43cdDaniel Dunbar    bool isDirect() const { return TheKind == Direct; }
127cc6fa88666ca2f287df4a600eb31a4087bab9c13Anton Korobeynikov    bool isExtend() const { return TheKind == Extend; }
1289eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    bool isIgnore() const { return TheKind == Ignore; }
12911e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    bool isIndirect() const { return TheKind == Indirect; }
1309eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    bool isExpand() const { return TheKind == Expand; }
131c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov
132800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner    bool canHaveCoerceToType() const {
133800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner      return TheKind == Direct || TheKind == Extend;
134800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner    }
1359cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer
136800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner    // Direct/Extend accessors
137117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner    unsigned getDirectOffset() const {
138117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      assert((isDirect() || isExtend()) && "Not a direct or extend kind");
139117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner      return UIntData;
140117e3f4cd4d6ea41c3202da8729f94168c5c8239Chris Lattner    }
141f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka
142f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka    llvm::Type *getPaddingType() const {
143f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka      return PaddingType;
144f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka    }
145f0cc2087b18c48b17c2f647c88a3e7eef19285fdAkira Hatanaka
146e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola    bool getPaddingInReg() const {
147e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola      return PaddingInReg;
148e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola    }
149e4aeeaae8ee93ad5e07c646046c650d594f2775eRafael Espindola
1509cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner    llvm::Type *getCoerceToType() const {
151800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner      assert(canHaveCoerceToType() && "Invalid kind!");
1529eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar      return TypeData;
1539eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    }
1549cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer
1559cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner    void setCoerceToType(llvm::Type *T) {
156800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner      assert(canHaveCoerceToType() && "Invalid kind!");
157800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner      TypeData = T;
158800588fd230d2c37ddce8fbf4a3881352715d700Chris Lattner    }
1599cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer
160b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    bool getInReg() const {
161b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola      assert((isDirect() || isExtend() || isIndirect()) && "Invalid kind!");
162b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola      return InReg;
163b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola    }
164b48280ba1790122cd3fa6e17c88ecd6a4571a4ebRafael Espindola
1650a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson    // Indirect accessors
16611e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar    unsigned getIndirectAlign() const {
16711e383aa491a23ebd4a49688a09984c5e16a2e34Daniel Dunbar      assert(TheKind == Indirect && "Invalid kind!");
1689eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar      return UIntData;
1699eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    }
1706f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar
1710a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson    bool getIndirectByVal() const {
1720a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson      assert(TheKind == Indirect && "Invalid kind!");
173cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar      return BoolData0;
174cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar    }
175cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar
176cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar    bool getIndirectRealign() const {
177cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar      assert(TheKind == Indirect && "Invalid kind!");
178cf3b6f2504596812db1fcef0df8ce5b3449c4aacDaniel Dunbar      return BoolData1;
1790a8f847e97f40cce51dc69051b964732333dc028Anders Carlsson    }
1809cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer
1816f7279bf98e31356306386b2c200820a76b491cfDaniel Dunbar    void dump() const;
1829eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  };
1839eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
1849eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  /// ABIInfo - Target specific hooks for defining how a type should be
1859eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  /// passed or returned from functions.
1869eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  class ABIInfo {
1879eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  public:
188ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner    CodeGen::CodeGenTypes &CGT;
189bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  protected:
190bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall    llvm::CallingConv::ID RuntimeCC;
191bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  public:
192bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall    ABIInfo(CodeGen::CodeGenTypes &cgt)
193bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall      : CGT(cgt), RuntimeCC(llvm::CallingConv::C) {}
1949cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer
1959eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar    virtual ~ABIInfo();
1969cac4942b920d4c5514e71949e3062ed626bfbdfMichael J. Spencer
197ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner    ASTContext &getContext() const;
198ea0443212e7ec6ff82e2f174e8e948a6eb0e0876Chris Lattner    llvm::LLVMContext &getVMContext() const;
19925a6a84cf5067b32c271e3ba078676dee838798dMicah Villmow    const llvm::DataLayout &getDataLayout() const;
20064aa4b3ec7e62288e2e66c1935487ece995ca94bJohn McCall    const TargetInfo &getTarget() const;
2016bad2658b48264629db595f944a3fbe07f61b4e9Daniel Dunbar
202bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall    /// Return the calling convention to use for system runtime
203bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall    /// functions.
204bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall    llvm::CallingConv::ID getRuntimeCC() const {
205bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall      return RuntimeCC;
206bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall    }
207bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall
208ee5dcd064a811edc90f6c1fb31a837b6c961fed7Chris Lattner    virtual void computeInfo(CodeGen::CGFunctionInfo &FI) const = 0;
209b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar
210b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar    /// EmitVAArg - Emit the target dependent code to load a value of
211b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar    /// \arg Ty from the va_list pointed to by \arg VAListAddr.
212c4a59eb306efeb4bffa3cefecd1e6392fc5c4144Anton Korobeynikov
213b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar    // FIXME: This is a gaping layering violation if we wanted to drop
214b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar    // the ABI information any lower than CodeGen. Of course, for
215b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar    // VAArg handling it has to be at this level; there is no way to
216b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar    // abstract this out.
217b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar    virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
218b53e3e71383233ebb68a6a736cbe8af6d8065700Daniel Dunbar                                   CodeGen::CodeGenFunction &CGF) const = 0;
2199eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar  };
2209eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar}  // end namespace clang
2219eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar
2229eb5c6d3242d85359b2d669564c5e2826efb1931Daniel Dunbar#endif
223