mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-06 02:45:25 +03:00
Fix naked DMD-style asm emission for non-Mac x86 Darwin targets
This commit is contained in:
parent
a31ac78037
commit
535160458d
5 changed files with 39 additions and 42 deletions
|
@ -418,6 +418,9 @@ void ArgsBuilder::addCppStdlibLinkFlags(const llvm::Triple &triple) {
|
||||||
break;
|
break;
|
||||||
case llvm::Triple::Darwin:
|
case llvm::Triple::Darwin:
|
||||||
case llvm::Triple::MacOSX:
|
case llvm::Triple::MacOSX:
|
||||||
|
case llvm::Triple::IOS:
|
||||||
|
case llvm::Triple::WatchOS:
|
||||||
|
case llvm::Triple::TvOS:
|
||||||
case llvm::Triple::FreeBSD:
|
case llvm::Triple::FreeBSD:
|
||||||
args.push_back("-lc++");
|
args.push_back("-lc++");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -248,10 +248,7 @@ static const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
|
||||||
|
|
||||||
static FloatABI::Type getARMFloatABI(const llvm::Triple &triple,
|
static FloatABI::Type getARMFloatABI(const llvm::Triple &triple,
|
||||||
const char *llvmArchSuffix) {
|
const char *llvmArchSuffix) {
|
||||||
switch (triple.getOS()) {
|
if (triple.isOSDarwin()) {
|
||||||
case llvm::Triple::Darwin:
|
|
||||||
case llvm::Triple::MacOSX:
|
|
||||||
case llvm::Triple::IOS: {
|
|
||||||
// Darwin defaults to "softfp" for v6 and v7.
|
// Darwin defaults to "softfp" for v6 and v7.
|
||||||
if (llvm::StringRef(llvmArchSuffix).startswith("v6") ||
|
if (llvm::StringRef(llvmArchSuffix).startswith("v6") ||
|
||||||
llvm::StringRef(llvmArchSuffix).startswith("v7")) {
|
llvm::StringRef(llvmArchSuffix).startswith("v7")) {
|
||||||
|
@ -260,35 +257,34 @@ static FloatABI::Type getARMFloatABI(const llvm::Triple &triple,
|
||||||
return FloatABI::Soft;
|
return FloatABI::Soft;
|
||||||
}
|
}
|
||||||
|
|
||||||
case llvm::Triple::FreeBSD:
|
if (triple.isOSFreeBSD()) {
|
||||||
// FreeBSD defaults to soft float
|
// FreeBSD defaults to soft float
|
||||||
return FloatABI::Soft;
|
return FloatABI::Soft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (triple.getVendorName().startswith("hardfloat"))
|
||||||
|
return FloatABI::Hard;
|
||||||
|
if (triple.getVendorName().startswith("softfloat"))
|
||||||
|
return FloatABI::SoftFP;
|
||||||
|
|
||||||
|
switch (triple.getEnvironment()) {
|
||||||
|
case llvm::Triple::GNUEABIHF:
|
||||||
|
return FloatABI::Hard;
|
||||||
|
case llvm::Triple::GNUEABI:
|
||||||
|
return FloatABI::SoftFP;
|
||||||
|
case llvm::Triple::EABI:
|
||||||
|
// EABI is always AAPCS, and if it was not marked 'hard', it's softfp
|
||||||
|
return FloatABI::SoftFP;
|
||||||
|
case llvm::Triple::Android: {
|
||||||
|
if (llvm::StringRef(llvmArchSuffix).startswith("v7")) {
|
||||||
|
return FloatABI::SoftFP;
|
||||||
|
}
|
||||||
|
return FloatABI::Soft;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
if (triple.getVendorName().startswith("hardfloat"))
|
// Assume "soft".
|
||||||
return FloatABI::Hard;
|
// TODO: Warn the user we are guessing.
|
||||||
if (triple.getVendorName().startswith("softfloat"))
|
return FloatABI::Soft;
|
||||||
return FloatABI::SoftFP;
|
|
||||||
|
|
||||||
switch (triple.getEnvironment()) {
|
|
||||||
case llvm::Triple::GNUEABIHF:
|
|
||||||
return FloatABI::Hard;
|
|
||||||
case llvm::Triple::GNUEABI:
|
|
||||||
return FloatABI::SoftFP;
|
|
||||||
case llvm::Triple::EABI:
|
|
||||||
// EABI is always AAPCS, and if it was not marked 'hard', it's softfp
|
|
||||||
return FloatABI::SoftFP;
|
|
||||||
case llvm::Triple::Android: {
|
|
||||||
if (llvm::StringRef(llvmArchSuffix).startswith("v7")) {
|
|
||||||
return FloatABI::SoftFP;
|
|
||||||
}
|
|
||||||
return FloatABI::Soft;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
// Assume "soft".
|
|
||||||
// TODO: Warn the user we are guessing.
|
|
||||||
return FloatABI::Soft;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,14 +19,14 @@
|
||||||
#include "ir/irfuncty.h"
|
#include "ir/irfuncty.h"
|
||||||
|
|
||||||
struct X86TargetABI : TargetABI {
|
struct X86TargetABI : TargetABI {
|
||||||
const bool isOSX;
|
const bool isDarwin;
|
||||||
const bool isMSVC;
|
const bool isMSVC;
|
||||||
bool returnStructsInRegs;
|
bool returnStructsInRegs;
|
||||||
IntegerRewrite integerRewrite;
|
IntegerRewrite integerRewrite;
|
||||||
IndirectByvalRewrite indirectByvalRewrite;
|
IndirectByvalRewrite indirectByvalRewrite;
|
||||||
|
|
||||||
X86TargetABI()
|
X86TargetABI()
|
||||||
: isOSX(global.params.targetTriple->isMacOSX()),
|
: isDarwin(global.params.targetTriple->isOSDarwin()),
|
||||||
isMSVC(global.params.targetTriple->isWindowsMSVCEnvironment()) {
|
isMSVC(global.params.targetTriple->isWindowsMSVCEnvironment()) {
|
||||||
using llvm::Triple;
|
using llvm::Triple;
|
||||||
auto os = global.params.targetTriple->getOS();
|
auto os = global.params.targetTriple->getOS();
|
||||||
|
@ -206,8 +206,8 @@ struct X86TargetABI : TargetABI {
|
||||||
|
|
||||||
// Clang does not pass empty structs, while it seems that GCC does,
|
// Clang does not pass empty structs, while it seems that GCC does,
|
||||||
// at least on Linux x86. We don't know whether the C compiler will
|
// at least on Linux x86. We don't know whether the C compiler will
|
||||||
// be Clang or GCC, so just assume Clang on OS X and G++ on Linux.
|
// be Clang or GCC, so just assume Clang on Darwin and G++ on Linux.
|
||||||
if (externD || !isOSX)
|
if (externD || !isDarwin)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
@ -247,7 +247,7 @@ struct X86TargetABI : TargetABI {
|
||||||
|
|
||||||
const char *objcMsgSendFunc(Type *ret, IrFuncTy &fty) override {
|
const char *objcMsgSendFunc(Type *ret, IrFuncTy &fty) override {
|
||||||
// see objc/message.h for objc_msgSend selection rules
|
// see objc/message.h for objc_msgSend selection rules
|
||||||
assert(isOSX);
|
assert(isDarwin);
|
||||||
if (fty.arg_sret) {
|
if (fty.arg_sret) {
|
||||||
return "objc_msgSend_stret";
|
return "objc_msgSend_stret";
|
||||||
}
|
}
|
||||||
|
|
|
@ -2322,11 +2322,10 @@ struct AsmProcessor {
|
||||||
// OSX and 32-bit Windows need an extra leading underscore when mangling a
|
// OSX and 32-bit Windows need an extra leading underscore when mangling a
|
||||||
// symbol name.
|
// symbol name.
|
||||||
static bool prependExtraUnderscore(LINK link) {
|
static bool prependExtraUnderscore(LINK link) {
|
||||||
return global.params.targetTriple->getOS() == llvm::Triple::MacOSX ||
|
const auto &triple = *global.params.targetTriple;
|
||||||
global.params.targetTriple->getOS() == llvm::Triple::Darwin ||
|
return triple.isOSDarwin() ||
|
||||||
// Win32: all symbols except for MSVC++ ones
|
// Win32: all symbols except for MSVC++ ones
|
||||||
(global.params.targetTriple->isOSWindows() &&
|
(triple.isOSWindows() && triple.isArch32Bit() && link != LINKcpp);
|
||||||
global.params.targetTriple->isArch32Bit() && link != LINKcpp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void addOperand(const char *fmt, AsmArgType type, Expression *e,
|
void addOperand(const char *fmt, AsmArgType type, Expression *e,
|
||||||
|
|
|
@ -158,12 +158,11 @@ void DtoDefineNakedFunction(FuncDeclaration *fd) {
|
||||||
|
|
||||||
const auto &triple = *global.params.targetTriple;
|
const auto &triple = *global.params.targetTriple;
|
||||||
bool const isWin = triple.isOSWindows();
|
bool const isWin = triple.isOSWindows();
|
||||||
bool const isOSX = (triple.getOS() == llvm::Triple::Darwin ||
|
bool const isDarwin = triple.isOSDarwin();
|
||||||
triple.getOS() == llvm::Triple::MacOSX);
|
|
||||||
|
|
||||||
// osx is different
|
// osx is different
|
||||||
// also mangling has an extra underscore prefixed
|
// also mangling has an extra underscore prefixed
|
||||||
if (isOSX) {
|
if (isDarwin) {
|
||||||
fullmangle += '_';
|
fullmangle += '_';
|
||||||
fullmangle += mangle;
|
fullmangle += mangle;
|
||||||
mangle = fullmangle.c_str();
|
mangle = fullmangle.c_str();
|
||||||
|
@ -233,7 +232,7 @@ void DtoDefineNakedFunction(FuncDeclaration *fd) {
|
||||||
|
|
||||||
// emit size after body
|
// emit size after body
|
||||||
// llvm does this on linux, but not on osx or Win
|
// llvm does this on linux, but not on osx or Win
|
||||||
if (!(isWin || isOSX)) {
|
if (!(isWin || isDarwin)) {
|
||||||
asmstr << "\t.size\t" << mangle << ", .-" << mangle << std::endl
|
asmstr << "\t.size\t" << mangle << ", .-" << mangle << std::endl
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue