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