[LLVMbugs] [Bug 7445] New: Not all template symbols exported when compiling with -O2

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Jun 21 17:37:32 CDT 2010


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

           Summary: Not all template symbols exported when compiling with
                    -O2
           Product: clang
           Version: unspecified
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: nicolasweber at gmx.de
                CC: llvmbugs at cs.uiuc.edu, dgregor at apple.com


Consider the following program (sorry for its size, I couldn't get it much
smaller):

$ cat test.cc
typedef unsigned int uint32_t;
namespace v8 {
  namespace internal {
    class Object {
      public:
        inline bool IsNull() {return false;}
    };
    template<typename Shape, typename Key> class HashTable {
      public:
        Object* KeyAt(int entry) {return 0;}
        int FindEntry(Key key);
        static uint32_t FirstProbe(uint32_t hash) {return 0;}
    };
    template <typename Shape, typename Key>
    class Dictionary: public HashTable<Shape, Key> {};
    class NumberDictionaryShape {
      public:
        static inline bool IsMatch() {return false;}
        static inline uint32_t Hash(uint32_t key) {return 0;}
    };
    class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t>
{
    };
    template<typename Shape, typename Key>
    int HashTable<Shape, Key>::FindEntry(Key key) {
      Object* element = KeyAt(0);
      !element->IsNull() && Shape::IsMatch();
      FirstProbe(Shape::Hash(key));
      return 0;
    }
    void f() { NumberDictionary().FindEntry(0); }

    // Explicit instantiation.
    template class Dictionary<NumberDictionaryShape, uint32_t>;
  }
}

If compiled with clang++, g++, and g++ -O2, the resulting object file contains
the symbol
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj (which is
mangled for "v8::internal::HashTable<v8::internal::NumberDictionaryShape,
unsigned int>::FindEntry(unsigned int)"):

$ g++ -c test.cc
$ nm test.o | grep
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj
00000062 S
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj
00000184 S
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj.eh
$ g++ -c -O2 test.cc
$ nm test.o | grep
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj
00000020 S
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj
00000044 S
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj.eh
$ ~/src/llvm/Release/bin/clang++ -c test.cc  # yields a harmless warning
test.cc:26:7: warning: expression result unused [-Wunused-value]
      !element->IsNull() && Shape::IsMatch();
      ^~~~~~~~~~~~~~~~~~
test.cc:30:35: note: in instantiation of member function
'v8::internal::HashTable<v8::internal::NumberDictionaryShape, unsigned
int>::FindEntry' requested here
    void f() { NumberDictionary().FindEntry(0); }
                                  ^
1 warning generated.
$ nm test.o | grep
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj
00000020 S
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj
00000188 S
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj.eh


However, if compiled with clang++ -O2, that symbol isn't exported:

$ ~/src/llvm/Release/bin/clang++ -O2 -c test.cc
# harmless warning omitted
$ nm test.o | grep
__ZN2v88internal9HashTableINS0_21NumberDictionaryShapeEjE9FindEntryEj

-- 
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 LLVMbugs mailing list