diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Basic/Targets.cpp | 6 | ||||
-rw-r--r-- | lib/CodeGen/TargetInfo.cpp | 28 |
2 files changed, 18 insertions, 16 deletions
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 43a21f2734..b56b42c798 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -269,6 +269,7 @@ public: // handled outside of clang. TODO: Handling this within clang may be // beneficial. this->UserLabelPrefix = ""; + this->MaxAtomicPromoteWidth = this->MaxAtomicInlineWidth = 32; } }; @@ -5102,8 +5103,11 @@ public: // the direction suggested here: // https://bugzilla.mozilla.org/show_bug.cgi?id=904913#c21 // We can still set the preferred alignment to 16 bytes though. + // + // Set the natural stack alignment to 16 bytes to accomodate 128-bit + // aligned vectors. DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-" - "f32:32:32-f64:64:64-p:32:32:32-v128:32:128-n32"; + "f32:32:32-f64:64:64-p:32:32:32-v128:32:128-n32-S128"; } void getDefaultFeatures(llvm::StringMap<bool> &Features) const { diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 5aa982e255..196596d40a 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -421,31 +421,33 @@ class EmscriptenABIInfo : public DefaultABIInfo { explicit EmscriptenABIInfo(CodeGen::CodeGenTypes &CGT) : DefaultABIInfo(CGT) {} ABIArgInfo classifyReturnType(QualType RetTy) const; - ABIArgInfo classifyArgumentType(QualType RetTy) const; + ABIArgInfo classifyArgumentType(QualType Ty) const; + + // DefaultABIInfo's classifyReturnType and classifyArgumentType are + // non-virtual, but computeInfo is virtual, so we overload that. + virtual void computeInfo(CGFunctionInfo &FI) const { + FI.getReturnInfo() = classifyReturnType(FI.getReturnType()); + for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); + it != ie; ++it) + it->info = classifyArgumentType(it->type); + } }; class EmscriptenTargetCodeGenInfo : public TargetCodeGenInfo { public: explicit EmscriptenTargetCodeGenInfo(CodeGen::CodeGenTypes &CGT) : TargetCodeGenInfo(new EmscriptenABIInfo(CGT)) {} - - // TODO: Re-evaluate whether these hacks, borrowed from PNaCl, are necessary. - bool addAsmMemoryAroundSyncSynchronize() const { return true; } - bool asmMemoryIsFence() const { return true; } }; /// \brief Classify argument of given type \p Ty. ABIArgInfo EmscriptenABIInfo::classifyArgumentType(QualType Ty) const { if (isAggregateTypeForABI(Ty)) { + unsigned TypeAlign = getContext().getTypeAlignInChars(Ty).getQuantity(); if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT)) - return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory); - return ABIArgInfo::getIndirect(0); + return ABIArgInfo::getIndirect(TypeAlign, RAA == CGCXXABI::RAA_DirectInMemory); + return ABIArgInfo::getIndirect(TypeAlign); } - // We can handle floating-point values directly. - if (Ty->isFloatingType()) - return ABIArgInfo::getDirect(); - // Otherwise just do the default thing. return DefaultABIInfo::classifyArgumentType(Ty); } @@ -458,10 +460,6 @@ ABIArgInfo EmscriptenABIInfo::classifyReturnType(QualType RetTy) const { return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0))); } - // We can handle floating-point values directly. - if (RetTy->isFloatingType()) - return ABIArgInfo::getDirect(); - // Otherwise just do the default thing. return DefaultABIInfo::classifyReturnType(RetTy); } |