[cfe-dev] Fwd: Method returns null pointer when compiling with optimizations (-O2)

Mikhail Ramalho via cfe-dev cfe-dev at lists.llvm.org
Tue Mar 8 10:40:42 PST 2016


Hi all,

I have the following code to try to get functionDecl from a given statement:

const clang::Decl* llvm_convertert::get_DeclContext_from_Stmt(
  const clang::Stmt& stmt)
{
  auto it = ASTContext->getParents(stmt).begin();

  if(it == ASTContext->getParents(stmt).end())
    return nullptr;

  const clang::Decl *aDecl = it->get<clang::Decl>();
  if(aDecl)
    return aDecl;

  const clang::Stmt *aStmt = it->get<clang::Stmt>();
  if(aStmt)
    return get_DeclContext_from_Stmt(*aStmt);

  return nullptr;
}

const clang::FunctionDecl* llvm_convertert::get_top_FunctionDecl_from_Stmt(
  const clang::Stmt& stmt)
{
  const clang::Decl *decl = get_DeclContext_from_Stmt(stmt);
  if(decl)
    return static_cast<const
clang::FunctionDecl*>(decl->getNonClosureContext());

  return nullptr;
}


Right now, I only call the method for a return statement:

const clang::ReturnStmt &ret =
  static_cast<const clang::ReturnStmt&>(stmt);

const clang::FunctionDecl *fd = get_top_FunctionDecl_from_Stmt(ret);


The code works fine when I compile it with O0 but stops working when
compiling with O2.

Here is the assembly generated with -O0:

000000000000c29e
<llvm_convertert::get_top_FunctionDecl_from_Stmt(clang::Stmt const&)>:
    c29e: 55                   push   %rbp
    c29f: 48 89 e5             mov    %rsp,%rbp
    c2a2: 48 83 ec 20           sub    $0x20,%rsp
    c2a6: 48 89 7d e8           mov    %rdi,-0x18(%rbp)
    c2aa: 48 89 75 e0           mov    %rsi,-0x20(%rbp)
    c2ae: 48 8b 55 e0           mov    -0x20(%rbp),%rdx
    c2b2: 48 8b 45 e8           mov    -0x18(%rbp),%rax
    c2b6: 48 89 d6             mov    %rdx,%rsi
    c2b9: 48 89 c7             mov    %rax,%rdi
    c2bc: e8 00 00 00 00       callq  c2c1
<llvm_convertert::get_top_FunctionDecl_from_Stmt(clang::Stmt const&)+0x23>
    c2c1: 48 89 45 f8           mov    %rax,-0x8(%rbp)
    c2c5: 48 83 7d f8 00       cmpq   $0x0,-0x8(%rbp)
    c2ca: 74 0e                 je     c2da
<llvm_convertert::get_top_FunctionDecl_from_Stmt(clang::Stmt const&)+0x3c>
    c2cc: 48 8b 45 f8           mov    -0x8(%rbp),%rax
    c2d0: 48 89 c7             mov    %rax,%rdi
    c2d3: e8 00 00 00 00       callq  c2d8
<llvm_convertert::get_top_FunctionDecl_from_Stmt(clang::Stmt const&)+0x3a>
    c2d8: eb 05                 jmp    c2df
<llvm_convertert::get_top_FunctionDecl_from_Stmt(clang::Stmt const&)+0x41>
    c2da: b8 00 00 00 00       mov    $0x0,%eax
    c2df: c9                   leaveq
    c2e0: c3                   retq
    c2e1: 90                   nop

and the assembly generated with -O2:

0000000000002160
<llvm_convertert::get_top_FunctionDecl_from_Stmt(clang::Stmt const&)>:
    2160: 48 83 ec 08           sub    $0x8,%rsp
    2164: e8 00 00 00 00       callq  2169
<llvm_convertert::get_top_FunctionDecl_from_Stmt(clang::Stmt const&)+0x9>
    2169: 48 85 c0             test   %rax,%rax
    216c: 74 12                 je     2180
<llvm_convertert::get_top_FunctionDecl_from_Stmt(clang::Stmt const&)+0x20>
    216e: 48 89 c7             mov    %rax,%rdi
    2171: 48 83 c4 08           add    $0x8,%rsp
    2175: e9 00 00 00 00       jmpq   217a
<llvm_convertert::get_top_FunctionDecl_from_Stmt(clang::Stmt const&)+0x1a>
    217a: 66 0f 1f 44 00 00     nopw   0x0(%rax,%rax,1)
    2180: 31 c0                 xor    %eax,%eax
    2182: 48 83 c4 08           add    $0x8,%rsp
    2186: c3                   retq
    2187: 90                   nop
    2188: 0f 1f 84 00 00 00 00 nopl   0x0(%rax,%rax,1)
    218f: 00

Does anyone has any idea why this is happening and how to fix it? The whole
assembly ended up being too big to be attached so I added them to dropbox
<https://www.dropbox.com/sh/vd5nhjzqaxk0ess/AADVPFkaxrGPWdAUcBkjmVPga?dl=0>.

I'm using clang 3.8 RC3 to link and building with g++ 5.3.1.

Thank you,

-- 

Mikhail Ramalho.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160308/5e403918/attachment-0001.html>


More information about the cfe-dev mailing list