http://llvm.org/bugs/show_bug.cgi?id=22316

            Bug ID: 22316
           Summary: invalid location range for variables in certain cases
                    in debug info
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: DebugInfo
          Assignee: [email protected]
          Reporter: [email protected]
                CC: [email protected]
    Classification: Unclassified

This seems to be reproducible across different architectures and OSes.

For x86:

/* RUN: clang -target i386-linux-gnu -g -O2 -c %s -o %t.obj */
void * __attribute__ (( regparm(2) )) f(void *, void *);
void * __attribute__ (( regparm(0) )) g(void *, void *);

void *g(void *t, void *k) {
  if (k == (void *)0)
    return (void *)0;
  return f(t, k);
}

<...>
< 2><0x0000003c>      DW_TAG_formal_parameter
                        DW_AT_location              <loclist with 1 entries
follows>
            [ 0]<lowpc=0x00000000><highpc=0x00000011>DW_OP_reg0
                        DW_AT_name                  "clang version 3.5.0 
(based on LLVM 3.5.0svn)"
                        DW_AT_decl_file             0x00000001 /tmp/reduced.c
                        DW_AT_decl_line             0x00000005
                        DW_AT_type                  <0x0000005b>
<...>

00000000 <g>:
   0:    8b 54 24 08              mov    0x8(%esp),%edx ; end of prologue
   4:    85 d2                    test   %edx,%edx      ; if (k == (void *)0)
   6:    74 09                    je     11 <g+0x11>    ;   return (void *)0;
   8:    8b 44 24 04              mov    0x4(%esp),%eax ; setup $eax
   c:    e9 fc ff ff ff           jmp    d <g+0xd>
  11:    31 c0                    xor    %eax,%eax
  13:    c3                       ret    

However, the DIE indicates that formal argument 0 is at DW_OP_reg0 or eax for
the entire subprogram.  However, the disassembly clearly indicates that this
not the case for the if check.  This results in invalid accesses for variables.

For ARM, you need to try a slightly different approach due to the AAPCS calling
convention.  I believe the following worked:

void *f(void *, void *);
void *g(int, int, int, int, void *, void *);

void *g(int a, int b, int c, int d, void *t, void *k) {
  if (k == (void *)0)
    return (void *)0;
  return f(t, k);
}

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to