mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-06 10:57:35 +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;
|
||||
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;
|
||||
|
|
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue