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;
case llvm::Triple::Darwin:
case llvm::Triple::MacOSX:
case llvm::Triple::IOS:
case llvm::Triple::WatchOS:
case llvm::Triple::TvOS:
case llvm::Triple::FreeBSD:
args.push_back("-lc++");
break;

View file

@ -248,10 +248,7 @@ static const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
static FloatABI::Type getARMFloatABI(const llvm::Triple &triple,
const char *llvmArchSuffix) {
switch (triple.getOS()) {
case llvm::Triple::Darwin:
case llvm::Triple::MacOSX:
case llvm::Triple::IOS: {
if (triple.isOSDarwin()) {
// Darwin defaults to "softfp" for v6 and v7.
if (llvm::StringRef(llvmArchSuffix).startswith("v6") ||
llvm::StringRef(llvmArchSuffix).startswith("v7")) {
@ -260,11 +257,11 @@ static FloatABI::Type getARMFloatABI(const llvm::Triple &triple,
return FloatABI::Soft;
}
case llvm::Triple::FreeBSD:
if (triple.isOSFreeBSD()) {
// FreeBSD defaults to soft float
return FloatABI::Soft;
}
default:
if (triple.getVendorName().startswith("hardfloat"))
return FloatABI::Hard;
if (triple.getVendorName().startswith("softfloat"))
@ -290,7 +287,6 @@ static FloatABI::Type getARMFloatABI(const llvm::Triple &triple,
return FloatABI::Soft;
}
}
}
/// Looks up a target based on an arch name and a target triple.
///

View file

@ -19,14 +19,14 @@
#include "ir/irfuncty.h"
struct X86TargetABI : TargetABI {
const bool isOSX;
const bool isDarwin;
const bool isMSVC;
bool returnStructsInRegs;
IntegerRewrite integerRewrite;
IndirectByvalRewrite indirectByvalRewrite;
X86TargetABI()
: isOSX(global.params.targetTriple->isMacOSX()),
: isDarwin(global.params.targetTriple->isOSDarwin()),
isMSVC(global.params.targetTriple->isWindowsMSVCEnvironment()) {
using llvm::Triple;
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,
// 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.
if (externD || !isOSX)
// be Clang or GCC, so just assume Clang on Darwin and G++ on Linux.
if (externD || !isDarwin)
return;
size_t i = 0;
@ -247,7 +247,7 @@ struct X86TargetABI : TargetABI {
const char *objcMsgSendFunc(Type *ret, IrFuncTy &fty) override {
// see objc/message.h for objc_msgSend selection rules
assert(isOSX);
assert(isDarwin);
if (fty.arg_sret) {
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
// symbol name.
static bool prependExtraUnderscore(LINK link) {
return global.params.targetTriple->getOS() == llvm::Triple::MacOSX ||
global.params.targetTriple->getOS() == llvm::Triple::Darwin ||
const auto &triple = *global.params.targetTriple;
return triple.isOSDarwin() ||
// Win32: all symbols except for MSVC++ ones
(global.params.targetTriple->isOSWindows() &&
global.params.targetTriple->isArch32Bit() && link != LINKcpp);
(triple.isOSWindows() && triple.isArch32Bit() && link != LINKcpp);
}
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;
bool const isWin = triple.isOSWindows();
bool const isOSX = (triple.getOS() == llvm::Triple::Darwin ||
triple.getOS() == llvm::Triple::MacOSX);
bool const isDarwin = triple.isOSDarwin();
// osx is different
// also mangling has an extra underscore prefixed
if (isOSX) {
if (isDarwin) {
fullmangle += '_';
fullmangle += mangle;
mangle = fullmangle.c_str();
@ -233,7 +232,7 @@ void DtoDefineNakedFunction(FuncDeclaration *fd) {
// emit size after body
// 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
<< std::endl;
}