forked from OSchip/llvm-project
Fix __attribute__((force_align_arg_pointer)) misalignment bug
The force_align_arg_pointer attribute was using a hardcoded 16-byte alignment value which in combination with -mstack-alignment=32 (or larger) would produce a misaligned stack which could result in crashes when accessing stack buffers using aligned AVX load/store instructions. Fix the issue by using the "stackrealign" function attribute instead of using a hardcoded 16-byte alignment. Patch By: Gramner Differential Revision: https://reviews.llvm.org/D45812 llvm-svn: 330331
This commit is contained in:
parent
23bcf06a15
commit
b127a39404
|
@ -1941,13 +1941,8 @@ void X86_32TargetCodeGenInfo::setTargetAttributes(
|
|||
return;
|
||||
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
|
||||
if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
|
||||
// Get the LLVM function.
|
||||
llvm::Function *Fn = cast<llvm::Function>(GV);
|
||||
|
||||
// Now add the 'alignstack' attribute with a value of 16.
|
||||
llvm::AttrBuilder B;
|
||||
B.addStackAlignmentAttr(16);
|
||||
Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
|
||||
Fn->addFnAttr("stackrealign");
|
||||
}
|
||||
if (FD->hasAttr<AnyX86InterruptAttr>()) {
|
||||
llvm::Function *Fn = cast<llvm::Function>(GV);
|
||||
|
@ -2299,13 +2294,8 @@ public:
|
|||
return;
|
||||
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
|
||||
if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
|
||||
// Get the LLVM function.
|
||||
auto *Fn = cast<llvm::Function>(GV);
|
||||
|
||||
// Now add the 'alignstack' attribute with a value of 16.
|
||||
llvm::AttrBuilder B;
|
||||
B.addStackAlignmentAttr(16);
|
||||
Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
|
||||
llvm::Function *Fn = cast<llvm::Function>(GV);
|
||||
Fn->addFnAttr("stackrealign");
|
||||
}
|
||||
if (FD->hasAttr<AnyX86InterruptAttr>()) {
|
||||
llvm::Function *Fn = cast<llvm::Function>(GV);
|
||||
|
@ -2431,13 +2421,8 @@ void WinX86_64TargetCodeGenInfo::setTargetAttributes(
|
|||
return;
|
||||
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
|
||||
if (FD->hasAttr<X86ForceAlignArgPointerAttr>()) {
|
||||
// Get the LLVM function.
|
||||
auto *Fn = cast<llvm::Function>(GV);
|
||||
|
||||
// Now add the 'alignstack' attribute with a value of 16.
|
||||
llvm::AttrBuilder B;
|
||||
B.addStackAlignmentAttr(16);
|
||||
Fn->addAttributes(llvm::AttributeList::FunctionIndex, B);
|
||||
llvm::Function *Fn = cast<llvm::Function>(GV);
|
||||
Fn->addFnAttr("stackrealign");
|
||||
}
|
||||
if (FD->hasAttr<AnyX86InterruptAttr>()) {
|
||||
llvm::Function *Fn = cast<llvm::Function>(GV);
|
||||
|
|
|
@ -71,7 +71,7 @@ void f15(void) {
|
|||
|
||||
// PR5254
|
||||
// CHECK-LABEL: define void @f16
|
||||
// CHECK: [[ALIGN:#[0-9]+]]
|
||||
// CHECK: [[SR:#[0-9]+]]
|
||||
// CHECK: {
|
||||
void __attribute__((force_align_arg_pointer)) f16(void) {
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ void f20(void) {
|
|||
// CHECK: attributes [[NUW]] = { nounwind optsize{{.*}} }
|
||||
// CHECK: attributes [[AI]] = { alwaysinline nounwind optsize{{.*}} }
|
||||
// CHECK: attributes [[NUW_OS_RN]] = { nounwind optsize readnone{{.*}} }
|
||||
// CHECK: attributes [[ALIGN]] = { nounwind optsize alignstack=16{{.*}} }
|
||||
// CHECK: attributes [[SR]] = { nounwind optsize{{.*}} "stackrealign"{{.*}} }
|
||||
// CHECK: attributes [[RT]] = { nounwind optsize returns_twice{{.*}} }
|
||||
// CHECK: attributes [[NR]] = { noreturn optsize }
|
||||
// CHECK: attributes [[NUW_RN]] = { nounwind optsize readnone }
|
||||
|
|
Loading…
Reference in New Issue