Fix naked DMD-style asm emission for non-Mac x86 Darwin targets

This commit is contained in:
Martin Kinkelin 2020-06-26 17:55:44 +02:00
parent a31ac78037
commit 535160458d
5 changed files with 39 additions and 42 deletions

View file

@ -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;

View file

@ -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;
}
} }
} }

View file

@ -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";
} }

View file

@ -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,

View file

@ -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;
} }