From: Anders Carlsson Date: Sat, 13 Oct 2007 00:45:48 +0000 (+0000) Subject: Add __builtin_va_list definitions for x86_64 and ppc64. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206a;p=clang Add __builtin_va_list definitions for x86_64 and ppc64. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42943 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Basic/TargetInfo.cpp b/Basic/TargetInfo.cpp index 20f12c7455..a3e0a2101d 100644 --- a/Basic/TargetInfo.cpp +++ b/Basic/TargetInfo.cpp @@ -260,4 +260,9 @@ void TargetInfo::getTargetBuiltins(const Builtin::Info *&Records, } } +/// getVAListDeclaration - Return the declaration to use for +/// __builtin_va_list, which is target-specific. +const char *TargetInfo::getVAListDeclaration() const { + return PrimaryTarget->getVAListDeclaration(); +} diff --git a/Driver/Targets.cpp b/Driver/Targets.cpp index bf05c645c9..e7e6a051da 100644 --- a/Driver/Targets.cpp +++ b/Driver/Targets.cpp @@ -279,6 +279,32 @@ static void getX86Defines(std::vector &Defs, bool is64Bit) { Define(Defs, "__LDBL_MIN__", "3.36210314311209350626e-4932L"); } +static const char* getI386VAListDeclaration() { + return "typedef char* __builtin_va_list;"; +} + +static const char* getX86_64VAListDeclaration() { + return + "typedef struct __va_list_tag {" + " unsigned gp_offset;" + " unsigned fp_offset;" + " void* overflow_arg_area;" + " void* reg_save_area;" + "} __builtin_va_list[1];"; +} + +static const char* getPPCVAListDeclaration() { + return + "typedef struct __va_list_tag {" + " unsigned char gpr;" + " unsigned char fpr;" + " unsigned short reserved;" + " void* overflow_arg_area;" + " void* reg_save_area;" + "} __builtin_va_list[1];"; +} + + /// PPC builtin info. namespace PPC { enum { @@ -336,6 +362,9 @@ public: unsigned &NumRecords) const { PPC::getBuiltins(Records, NumRecords); } + virtual const char *getVAListDeclaration() const { + return getPPCVAListDeclaration(); + } }; } // end anonymous namespace. @@ -350,6 +379,9 @@ public: unsigned &NumRecords) const { PPC::getBuiltins(Records, NumRecords); } + virtual const char *getVAListDeclaration() const { + return getPPCVAListDeclaration(); + } }; } // end anonymous namespace. @@ -364,6 +396,10 @@ public: unsigned &NumRecords) const { X86::getBuiltins(Records, NumRecords); } + + virtual const char *getVAListDeclaration() const { + return getI386VAListDeclaration(); + } }; } // end anonymous namespace. @@ -378,6 +414,9 @@ public: unsigned &NumRecords) const { X86::getBuiltins(Records, NumRecords); } + virtual const char *getVAListDeclaration() const { + return getX86_64VAListDeclaration(); + } }; } // end anonymous namespace. @@ -398,6 +437,9 @@ public: unsigned &NumRecords) const { X86::getBuiltins(Records, NumRecords); } + virtual const char *getVAListDeclaration() const { + return getI386VAListDeclaration(); + } }; } // end anonymous namespace. diff --git a/include/clang/Basic/TargetInfo.h b/include/clang/Basic/TargetInfo.h index 02a0f88da5..334f87851d 100644 --- a/include/clang/Basic/TargetInfo.h +++ b/include/clang/Basic/TargetInfo.h @@ -185,10 +185,8 @@ public: /// getVAListDeclaration - Return the declaration to use for /// __builtin_va_list, which is target-specific. - const char *getVAListDeclaration() const { - // FIXME: dispatch to target impl. - return "typedef char* __builtin_va_list;"; - } + const char *getVAListDeclaration() const; + ///===---- Some helper methods ------------------------------------------===// unsigned getCharWidth(SourceLocation Loc) { @@ -244,6 +242,10 @@ public: /// "#define X Y\n". virtual void getTargetDefines(std::vector &Defines) const = 0; + /// getVAListDeclaration - Return the declaration to use for + /// __builtin_va_list, which is target-specific. + virtual const char *getVAListDeclaration() const = 0; + /// getWCharWidth - Return the size of wchar_t in bits. /// void getWCharInfo(unsigned &Size, unsigned &Align) const {