llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.08k stars 11.59k forks source link

Aligned argument crashes x86_64 backend when targeting Linux #21462

Closed 991901f3-cc14-4404-b340-165691b62a58 closed 1 year ago

991901f3-cc14-4404-b340-165691b62a58 commented 9 years ago
Bugzilla Link 21088
Version unspecified
OS All
CC @echristo,@hfinkel

Extended Description

consider: cat ~/t.cpp

struct __attribute__((aligned(32))) A {
  long x, y;
};
long f(struct A a) { return a.y; }

~/llvm/Debug+Asserts/bin/clang -cc1 -x c -triple x86_64-pc-linux ~/t.cpp -S -o -

clang: ~/llvm/src/lib/CodeGen/MachineFunction.cpp:499: void llvm::MachineFrameInfo::ensureMaxAlignment(unsigned int): Assertion `Align <= getFrameLowering()->getStackAlignment() && "For targets without stack realignment, Align is out of limit!"' failed.
0  clang           0x00000000021aa8db llvm::sys::PrintStackTrace(_IO_FILE*) + 38
1  clang           0x00000000021aab58
2  clang           0x00000000021aa457
3  libpthread.so.0 0x00007f3326b60340
4  libc.so.6       0x00007f3325f9dbb9 gsignal + 57
5  libc.so.6       0x00007f3325fa0fc8 abort + 328
6  libc.so.6       0x00007f3325f96a76
7  libc.so.6       0x00007f3325f96b22
8  clang           0x0000000001b51380 llvm::MachineFrameInfo::ensureMaxAlignment(unsigned int) + 132
9  clang           0x0000000001abc92a llvm::CCState::HandleByVal(unsigned int, llvm::MVT, llvm::MVT, llvm::CCValAssign::LocInfo, int, int, llvm::ISD::ArgFlagsTy) + 116
10 clang           0x00000000017e7519
11 clang           0x00000000017e7422
12 clang           0x00000000017e509a
13 clang           0x0000000001abcae8 llvm::CCState::AnalyzeFormalArguments(llvm::SmallVectorImpl<llvm::ISD::InputArg> const&, bool (*)(unsigned int, llvm::MVT, llvm::MVT, llvm::CCValAssign::LocInfo, llvm::ISD::ArgFlagsTy, llvm::CCState&)) + 128
14 clang           0x00000000017eeac1 llvm::X86TargetLowering::LowerFormalArguments(llvm::SDValue, unsigned int, bool, llvm::SmallVectorImpl<llvm::ISD::InputArg> const&, llvm::SDLoc, llvm::SelectionDAG&, llvm::SmallVectorImpl<llvm::SDValue>&) const + 635
15 clang           0x0000000002605212 llvm::SelectionDAGISel::LowerArguments(llvm::Function const&) + 2604
16 clang           0x0000000002621bfb llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) + 979
17 clang           0x000000000261e9d5 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) + 1091
18 clang           0x00000000017c5190
19 clang           0x0000000001b5993d llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 95
20 clang           0x0000000001e22cdc llvm::FPPassManager::runOnFunction(llvm::Function&) + 290
21 clang           0x0000000001e22e4c llvm::FPPassManager::runOnModule(llvm::Module&) + 84
22 clang           0x0000000001e2316a
23 clang           0x0000000001e2380e llvm::legacy::PassManagerImpl::run(llvm::Module&) + 244
24 clang           0x0000000001e23a2d llvm::legacy::PassManager::run(llvm::Module&) + 39
25 clang           0x00000000026d5791
26 clang           0x00000000026d5860 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*) + 127
27 clang           0x00000000026be04d
28 clang           0x0000000003061ce2 clang::ParseAST(clang::Sema&, bool, bool) + 776
29 clang           0x000000000238f8d2 clang::ASTFrontendAction::ExecuteAction() + 322
30 clang           0x00000000026c032d clang::CodeGenAction::ExecuteAction() + 1467
31 clang           0x000000000238f3ad clang::FrontendAction::Execute() + 139
32 clang           0x000000000235a470 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 770
33 clang           0x000000000249855b clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 993
34 clang           0x000000000110858e cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 770
35 clang           0x0000000001101534
36 clang           0x0000000001101ae0 main + 1015
37 libc.so.6       0x00007f3325f88ec5 __libc_start_main + 245
38 clang           0x00000000010fe789
Stack dump:
0.      Program arguments: ~/llvm/Debug+Asserts/bin/clang -cc1 -x c -triple x86_64-pc-linux t.cpp -S -o - 
1.      <eof> parser at end of file
2.      Code generation
3.      Running pass 'Function Pass Manager' on module 't.cpp'.
4.      Running pass 'X86 DAG->DAG Instruction Selection' on function '@f'
llvmbot commented 9 years ago

I suspect the assert() is misleading a bit. Dynamic stack realignment can't do anything to help with function arguments, just local variables.

echristo commented 9 years ago

Weird, linux is supposed to support dynamic realignment, otherwise how do we handle avx stuff on the stack? Adding Jim because he's been in this area the most.

Endilll commented 1 year ago

Can't reproduce using Clang 3.5 and 3.6 with assertions enabled: https://godbolt.org/z/96qs3zMq3

llvmbot commented 1 year ago

@llvm/issue-subscribers-c

llvmbot commented 1 year ago

@llvm/issue-subscribers-backend-x86