diff options
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/TargetABIInfo.cpp | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/lib/CodeGen/TargetABIInfo.cpp b/lib/CodeGen/TargetABIInfo.cpp index e28a1940a6..a307435fa1 100644 --- a/lib/CodeGen/TargetABIInfo.cpp +++ b/lib/CodeGen/TargetABIInfo.cpp @@ -16,6 +16,7 @@ #include "CodeGenFunction.h" #include "clang/AST/RecordLayout.h" #include "llvm/Type.h" +#include "llvm/ADT/Triple.h" using namespace clang; using namespace CodeGen; @@ -1521,32 +1522,44 @@ const ABIInfo &CodeGenTypes::getABIInfo() const { if (TheABIInfo) return *TheABIInfo; - // For now we just cache this in the CodeGenTypes and don't bother - // to free it. - const char *TargetPrefix = getContext().Target.getTargetPrefix(); - if (strcmp(TargetPrefix, "x86") == 0) { - bool IsDarwin = strstr(getContext().Target.getTargetTriple(), "darwin"); - bool isRegStructReturnABI = IsDarwin || - strstr(getContext().Target.getTargetTriple(), "cygwin") || - strstr(getContext().Target.getTargetTriple(), "mingw") || - strstr(getContext().Target.getTargetTriple(), "netware") || - strstr(getContext().Target.getTargetTriple(), "freebsd") || - strstr(getContext().Target.getTargetTriple(), "openbsd"); - switch (getContext().Target.getPointerWidth(0)) { - case 32: - return *(TheABIInfo = - new X86_32ABIInfo(Context, IsDarwin, isRegStructReturnABI)); - case 64: - return *(TheABIInfo = new X86_64ABIInfo()); + // For now we just cache the ABIInfo in CodeGenTypes and don't free it. + + llvm::Triple TargetTriple(getContext().Target.getTargetTriple()); + switch (TargetTriple.getArch()) { + default: + return *(TheABIInfo = new DefaultABIInfo); + + case llvm::Triple::x86: { + llvm::Triple::OSType OS = TargetTriple.getOS(); + + if (OS == llvm::Triple::Darwin) + return *(TheABIInfo = new X86_32ABIInfo(Context, true, true)); + + switch (OS) { + case llvm::Triple::Cygwin: + case llvm::Triple::DragonFly: + case llvm::Triple::MinGW32: + case llvm::Triple::MinGW64: + case llvm::Triple::NetBSD: + case llvm::Triple::OpenBSD: + return *(TheABIInfo = new X86_32ABIInfo(Context, false, true)); + + default: + return *(TheABIInfo = new X86_32ABIInfo(Context, false, false)); } - } else if (strcmp(TargetPrefix, "arm") == 0) { + } + + case llvm::Triple::x86_64: + return *(TheABIInfo = new X86_64ABIInfo()); + + case llvm::Triple::arm: // FIXME: Support for OABI? return *(TheABIInfo = new ARMABIInfo()); - } else if (strcmp(TargetPrefix, "pic16") == 0) { + + case llvm::Triple::pic16: return *(TheABIInfo = new PIC16ABIInfo()); - } else if (strcmp(TargetPrefix, "s390x") == 0) { + + case llvm::Triple::systemz: return *(TheABIInfo = new SystemZABIInfo()); } - - return *(TheABIInfo = new DefaultABIInfo); } |