Add ABI infrastructure for PPC64.

The generic ABI works well with PPC64 except for LLVM PR 14779.
(http://llvm.org/bugs/show_bug.cgi?id=14779)
The new ABI infrastucture is based on the UnknownTargetABI. The
PPC64 specific parts coming soon.
This commit is contained in:
kai
2013-01-28 22:01:29 +01:00
parent 145e1b5b24
commit b2a19959bf
3 changed files with 85 additions and 0 deletions

59
gen/abi-ppc64.cpp Normal file
View File

@@ -0,0 +1,59 @@
//===-- abi-x86-64.cpp ----------------------------------------------------===//
//
// LDC the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
//
// The PowerOpen 64bit ABI can be found here:
// http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html
//
//===----------------------------------------------------------------------===//
#include "gen/abi.h"
#include "gen/irstate.h"
#include "gen/tollvm.h"
#include "gen/llvmhelpers.h"
#include "gen/dvalue.h"
struct PPC64TargetABI : TargetABI {
void newFunctionType(TypeFunction* tf)
{
}
bool returnInArg(TypeFunction* tf)
{
#if DMDV2
if (tf->isref)
return false;
#endif
// Return structs and static arrays on the stack. The latter is needed
// because otherwise LLVM tries to actually return the array in a number
// of physical registers, which leads, depending on the target, to
// either horrendous codegen or backend crashes.
Type* rt = tf->next->toBasetype();
return (rt->ty == Tstruct || rt->ty == Tsarray);
}
bool passByVal(Type* t)
{
return t->toBasetype()->ty == Tstruct;
}
void doneWithFunctionType()
{
}
void rewriteFunctionType(TypeFunction* tf)
{
}
};
// The public getter for abi.cpp
TargetABI* getPPC64TargetABI()
{
return new PPC64TargetABI();
}

23
gen/abi-ppc64.h Normal file
View File

@@ -0,0 +1,23 @@
//===-- gen/abi-x86-64.h - x86_64 ABI description ---------------*- C++ -*-===//
//
// LDC the LLVM D compiler
//
// This file is distributed under the BSD-style LDC license. See the LICENSE
// file for details.
//
//===----------------------------------------------------------------------===//
//
// The ABI implementation used for 64 bit PowerPC targets.
//
//===----------------------------------------------------------------------===//
#ifndef __LDC_GEN_ABI_PPC64_H__
#define __LDC_GEN_ABI_PPC64_H__
#include "gen/abi.h"
TargetABI* getPPC64TargetABI();
#endif

View File

@@ -20,6 +20,7 @@
#include "gen/logger.h"
#include "gen/dvalue.h"
#include "gen/abi-generic.h"
#include "gen/abi-ppc64.h"
#include "gen/abi-x86.h"
#include "gen/abi-x86-64.h"
#include "ir/irfunction.h"
@@ -74,6 +75,8 @@ TargetABI * TargetABI::getTarget()
return getX86TargetABI();
case ARCHx86_64:
return getX86_64TargetABI();
case ARCHppc_64:
return getPPC64TargetABI();
default:
Logger::cout() << "WARNING: Unknown ABI, guessing...\n";
return new UnknownTargetABI;