Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp (revision 54955) +++ lib/Basic/Targets.cpp (working copy) @@ -41,17 +41,8 @@ DarwinTargetInfo(const std::string& triple) : TargetInfo(triple) {} virtual void getTargetDefines(std::vector &Defs) const { -// FIXME: we need a real target configuration system. For now, only define -// __APPLE__ if the host has it. -#ifdef __APPLE__ Define(Defs, "__APPLE__"); Define(Defs, "__MACH__"); -#endif - -/* FIXME. we may also need to distinguish between darwin and linux targets */ -#ifdef linux - Define(Defs, "linux"); -#endif if (0) // darwin_pascal_strings Define(Defs, "__PASCAL_STRINGS__"); @@ -59,18 +50,27 @@ }; +class LinuxTargetInfo : public TargetInfo { +public: + LinuxTargetInfo(const std::string& triple) : TargetInfo(triple) {} + + virtual void getTargetDefines(std::vector &Defs) const { + Define(Defs, "__linux__"); + Define(Defs, "__linux"); + // FIXME: gcc doesn't define linux for -ansi/-std=c99/etc. + Define(Defs, "linux"); + } +}; + + class SolarisTargetInfo : public TargetInfo { public: SolarisTargetInfo(const std::string& triple) : TargetInfo(triple) {} virtual void getTargetDefines(std::vector &Defs) const { -// FIXME: we need a real target configuration system. For now, only define -// __SUN__ if the host has it. -#ifdef __SUN__ Define(Defs, "__SUN__"); Define(Defs, "__SOLARIS__"); -#endif } }; @@ -690,6 +690,9 @@ LongDoubleWidth = 128; LongDoubleAlign = 128; LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; + DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32:64-" + "f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-" + "f80:128:128"; } virtual void getTargetDefines(std::vector &Defines) const { @@ -730,6 +733,56 @@ } // end anonymous namespace. namespace { +class LinuxI386TargetInfo : public LinuxTargetInfo { +public: + LinuxI386TargetInfo(const std::string& triple) : LinuxTargetInfo(triple) { + DoubleAlign = LongLongAlign = 32; + LongDoubleWidth = 96; + LongDoubleAlign = 32; + LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; + DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" + "i64:32:64-f32:32:32-f64:32:64-v64:64:64-" + "v128:128:128-a0:0:64-f80:32:32"; + } + + virtual void getTargetDefines(std::vector &Defines) const { + LinuxTargetInfo::getTargetDefines(Defines); + getX86Defines(Defines, false); + } + virtual void getTargetBuiltins(const Builtin::Info *&Records, + unsigned &NumRecords) const { + X86::getBuiltins(Records, NumRecords); + } + virtual const char *getVAListDeclaration() const { + return getI386VAListDeclaration(); + } + virtual const char *getTargetPrefix() const { + return X86::getTargetPrefix(); + } + virtual void getGCCRegNames(const char * const *&Names, + unsigned &NumNames) const { + X86::getGCCRegNames(Names, NumNames); + } + virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, + unsigned &NumAliases) const { + X86::getGCCRegAliases(Aliases, NumAliases); + } + virtual bool validateAsmConstraint(char c, + TargetInfo::ConstraintInfo &info) const { + return X86::validateAsmConstraint(c, info); + } + + virtual std::string convertConstraint(const char Constraint) const { + return X86::convertConstraint(Constraint); + } + + virtual const char *getClobbers() const { + return X86::getClobbers(); + } +}; +} // end anonymous namespace. + +namespace { class DarwinX86_64TargetInfo : public DarwinTargetInfo { public: DarwinX86_64TargetInfo(const std::string& triple) : DarwinTargetInfo(triple) { @@ -774,6 +827,50 @@ }; } // end anonymous namespace. +namespace { +class LinuxX86_64TargetInfo : public LinuxTargetInfo { +public: + LinuxX86_64TargetInfo(const std::string& triple) : LinuxTargetInfo(triple) { + LongWidth = LongAlign = PointerWidth = PointerAlign = 64; + LongDoubleWidth = 128; + LongDoubleAlign = 128; + LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; + } + + virtual void getTargetDefines(std::vector &Defines) const { + LinuxTargetInfo::getTargetDefines(Defines); + getX86Defines(Defines, true); + } + virtual void getTargetBuiltins(const Builtin::Info *&Records, + unsigned &NumRecords) const { + X86::getBuiltins(Records, NumRecords); + } + virtual const char *getVAListDeclaration() const { + return getX86_64VAListDeclaration(); + } + virtual const char *getTargetPrefix() const { + return X86::getTargetPrefix(); + } + virtual void getGCCRegNames(const char * const *&Names, + unsigned &NumNames) const { + X86::getGCCRegNames(Names, NumNames); + } + virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, + unsigned &NumAliases) const { + X86::getGCCRegAliases(Aliases, NumAliases); + } + virtual bool validateAsmConstraint(char c, + TargetInfo::ConstraintInfo &info) const { + return X86::validateAsmConstraint(c, info); + } + virtual std::string convertConstraint(const char Constraint) const { + return X86::convertConstraint(Constraint); + } + virtual const char *getClobbers() const { + return X86::getClobbers(); + } +}; +} // end anonymous namespace. namespace { class DarwinARMTargetInfo : public DarwinTargetInfo { @@ -910,26 +1007,42 @@ /// CreateTargetInfo - Return the target info object for the specified target /// triple. TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) { - if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) - return new DarwinPPCTargetInfo(T); + if (T.find("-apple-darwin") != std::string::npos) { - if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) - return new DarwinPPC64TargetInfo(T); + if (T.find("ppc-") == 0 || T.find("powerpc-") == 0) + return new DarwinPPCTargetInfo(T); - if (T.find("armv6-") == 0 || T.find("arm-") == 0) - return new DarwinARMTargetInfo(T); + if (T.find("ppc64-") == 0 || T.find("powerpc64-") == 0) + return new DarwinPPC64TargetInfo(T); - if (T.find("sparc-") == 0) - return new SolarisSparcV8TargetInfo(T); // ugly hack + if (T.find("armv6-") == 0 || T.find("arm-") == 0) + return new DarwinARMTargetInfo(T); - if (T.find("x86_64-") == 0) - return new DarwinX86_64TargetInfo(T); + if (T.find("x86_64-") == 0) + return new DarwinX86_64TargetInfo(T); - if (T.find("pic16-") == 0) + if (IsX86(T)) + return new DarwinI386TargetInfo(T); + + } else if (T.find("-solaris-") != std::string::npos) { + + if (T.find("sparc-") == 0) + return new SolarisSparcV8TargetInfo(T); // ugly hack + + } else if (T.find("-linux-") != std::string::npos) { + + if (T.find("x86_64-") == 0) + return new LinuxX86_64TargetInfo(T); + + if (IsX86(T)) + return new LinuxI386TargetInfo(T); + + } else if (T.find("pic16-") == 0) { + + // An embedded target return new PIC16TargetInfo(T); - if (IsX86(T)) - return new DarwinI386TargetInfo(T); + } return NULL; }