[LLVMbugs] [Bug 11180] New: unresolved symbol when taking a local label's address

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Oct 19 09:13:52 PDT 2011


           Summary: unresolved symbol when taking a local label's address
           Product: new-bugs
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: pageexec at freemail.hu
                CC: llvmbugs at cs.uiuc.edu
            Blocks: 4068

Created an attachment (id=7480)
 --> (http://llvm.org/bugs/attachment.cgi?id=7480)
preprocessed source

clang/llvm has for some time supported local labels that linux makes use of:

#define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })

this support also seems to be partially broken lately, the produced asm
sometimes refers to an unresolved symbol instead of the label's address but
seemingly only when the above macro is used in a static inline function and an
out-of-line body is generated for this function.

the attached case reproduces the problem for the function try_module_get on
linux/amd64. the following command line was used to compile it:

clang -c -nostdinc -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -W
-Wno-unused-parameter -Wno-missing-field-initializers -Wno-self-assign
-Wno-unused-value -Wno-format -mno-sse -Wno-unknown-warning-option
-fcatch-undefined-behavior -fno-strict-aliasing -fno-common
-Werror-implicit-function-declaration -Wno-format-security
-fno-delete-null-pointer-checks -Wno-empty-body -O2 -m64 -march=core2
-mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -pipe
-Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2
-mno-3dnow -Wframe-larger-than=2048 -fno-stack-protector
-Wno-unused-but-set-variable -fno-omit-frame-pointer
-fno-optimize-sibling-calls -g -femit-struct-debug-baseonly -pg
-Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow
-fconserve-stack -o anon_inodes.o anon_inodes.i

the resulting asm shows one inlined body of try_module_get in
anon_inode_getfile with a correct (resolved) reference to within the function
whereas the out-of-line copy has a reference to an unresolved symbol .L<xxx> 
(another, perhaps related, issue is why an out-of-line body was generated in
the first place as the function gets inlined into every caller and its address
is not taken in the given compilation unit as far as i can tell).

PS: since this is the last remaining bug that prevents compiling linux (modulo
the usual patches needed on the linux side), it'd be nice if the fix could be
backported to the 3.0 branch as well.

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list