From ef05abda02375a6565edcc0bdf20bdd41c0a87b3 Mon Sep 17 00:00:00 2001 From: Ivan Krasin Date: Wed, 24 Aug 2011 20:22:22 +0000 Subject: [PATCH] Add PNaCl TargetInfo. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138470 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets.cpp | 72 ++++++++++++++++++++++++++ test/Driver/le32-unknown-nacl.cpp | 86 +++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 test/Driver/le32-unknown-nacl.cpp diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 07c5bb85c8..fb1a08e09f 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -2843,6 +2843,70 @@ void MipselTargetInfo::getTargetDefines(const LangOptions &Opts, } } // end anonymous namespace. +namespace { +class PNaClTargetInfo : public TargetInfo { +public: + PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) { + this->UserLabelPrefix = ""; + this->LongAlign = 32; + this->LongWidth = 32; + this->PointerAlign = 32; + this->PointerWidth = 32; + this->IntMaxType = TargetInfo::SignedLongLong; + this->UIntMaxType = TargetInfo::UnsignedLongLong; + this->Int64Type = TargetInfo::SignedLongLong; + this->SizeType = TargetInfo::UnsignedInt; + DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" + "f32:32:32-f64:64:64-p:32:32:32-v128:32:32"; + } + + void getDefaultFeatures(const std::string &CPU, + llvm::StringMap &Features) const { + } + virtual void getArchDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + Builder.defineMacro("__le32__"); + Builder.defineMacro("__pnacl__"); + } + virtual void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + Builder.defineMacro("__native_client__"); + getArchDefines(Opts, Builder); + } + virtual void getTargetBuiltins(const Builtin::Info *&Records, + unsigned &NumRecords) const { + } + virtual const char *getVAListDeclaration() const { + return "typedef void* __builtin_va_list;"; + } + virtual void getGCCRegNames(const char * const *&Names, + unsigned &NumNames) const; + virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, + unsigned &NumAliases) const; + virtual bool validateAsmConstraint(const char *&Name, + TargetInfo::ConstraintInfo &Info) const { + return false; + } + + virtual const char *getClobbers() const { + return ""; + } +}; + +void PNaClTargetInfo::getGCCRegNames(const char * const *&Names, + unsigned &NumNames) const { + Names = NULL; + NumNames = 0; +} + +void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases, + unsigned &NumAliases) const { + Aliases = NULL; + NumAliases = 0; +} +} // end anonymous namespace. + + //===----------------------------------------------------------------------===// // Driver code //===----------------------------------------------------------------------===// @@ -2913,6 +2977,14 @@ static TargetInfo *AllocateTarget(const std::string &T) { return new MipsTargetInfo(T); } + case llvm::Triple::le32: + switch (os) { + case llvm::Triple::NativeClient: + return new PNaClTargetInfo(T); + default: + return NULL; + } + case llvm::Triple::ppc: if (Triple.isOSDarwin()) return new DarwinPPC32TargetInfo(T); diff --git a/test/Driver/le32-unknown-nacl.cpp b/test/Driver/le32-unknown-nacl.cpp new file mode 100644 index 0000000000..2ec2bd538f --- /dev/null +++ b/test/Driver/le32-unknown-nacl.cpp @@ -0,0 +1,86 @@ +// RUN: %clang -ccc-host-triple le32-unknown-nacl -ccc-echo %s -emit-llvm -c -o /tmp/OUTPUTNAME 2> %t.log + +// Make sure we used clang. +// RUN: grep 'clang\(-[0-9.]\+\)\?\(\.[Ee][Xx][Ee]\)\?" -cc1 .*le32-unknown-nacl.c' %t.log + +// RUN: llvm-dis < /tmp/OUTPUTNAME | FileCheck %s + +// Check platform defines +#include + +extern "C" { + +#ifdef __native_client__ +void __native_client__defined() { + // CHECK: __native_client__defined +} +#endif + +#ifdef __le32__ +void __le32__defined() { + // CHECK: __le32__defined +} +#endif + +#ifdef __pnacl__ +void __pnacl__defined() { + // CHECK: __pnacl__defined +} +#endif + +// Check types + +// CHECK: signext i8 @check_char() +char check_char() { return 0; } + +// CHECK: signext i16 @check_short() +short check_short() { return 0; } + +// CHECK: i32 @check_int() +int check_int() { return 0; } + +// CHECK: i32 @check_long() +long check_long() { return 0; } + +// CHECK: i64 @check_longlong() +long long check_longlong() { return 0; } + +// CHECK: zeroext i8 @check_uchar() +unsigned char check_uchar() { return 0; } + +// CHECK: zeroext i16 @check_ushort() +unsigned short check_ushort() { return 0; } + +// CHECK: i32 @check_uint() +unsigned int check_uint() { return 0; } + +// CHECK: i32 @check_ulong() +unsigned long check_ulong() { return 0; } + +// CHECK: i64 @check_ulonglong() +unsigned long long check_ulonglong() { return 0; } + +// CHECK: i32 @check_size_t() +size_t check_size_t() { return 0; } + +// CHECK: float @check_float() +float check_float() { return 0; } + +// CHECK: double @check_double() +double check_double() { return 0; } + +} + +// Check that pointers are 32-bit. + +template void Switch(); +template<> void Switch<4>(); +template<> void Switch<8>(); + +void check_pointer_size() { + // CHECK: SwitchILi4 + Switch(); + + // CHECK: SwitchILi8 + Switch(); +} -- 2.40.0