[cfe-commits] r116186 - in /cfe/trunk: lib/CodeGen/CGRTTI.cpp lib/CodeGen/CGVTables.cpp lib/CodeGen/CGVTables.h test/CodeGenCXX/vtable-linkage.cpp
Douglas Gregor
dgregor at apple.com
Mon Oct 11 14:20:50 PDT 2010
On Oct 11, 2010, at 2:18 PM, Argyrios Kyrtzidis wrote:
> On 11 Oct 2010, at 14:15, Douglas Gregor wrote:
>
>>
>> On Oct 11, 2010, at 2:03 PM, Argyrios Kyrtzidis wrote:
>>
>>> On 11 Oct 2010, at 13:42, Douglas Gregor wrote:
>>>
>>>>
>>>> On Oct 11, 2010, at 11:22 AM, Argyrios Kyrtzidis wrote:
>>>>
>>>>> $ cat t.cpp
>>>>> template <typename T>
>>>>> struct S {
>>>>> virtual void m();
>>>>> };
>>>>>
>>>>> void f() {
>>>>> S<int> *s = new S<int>;
>>>>> }
>>>>>
>>>>> $ clang -S -emit-llvm t.cpp -o -
>>>>> [...]
>>>>> @_ZTV1SIiE = external constant [3 x i8*]
>>>>> [...]
>>>>>
>>>>> $ llvm-gcc -S -emit-llvm t.cpp -o -
>>>>> [...]
>>>>> %struct.__class_type_info_pseudo = type { %struct.__type_info_pseudo }
>>>>> %struct.__type_info_pseudo = type { i8*, i8* }
>>>>>
>>>>> @_ZTV1SIiE = weak_odr constant [3 x i32 (...)*] [i32 (...)* null, i32 (...)* bitcast (%struct.__class_type_info_pseudo* @_ZTI1SIiE to i32 (...)*), i32 (...)* bitcast (void (%"struct.S<int>"*)* @_ZN1SIiE1mEv to i32 (...)*)], align 16 ; <[3 x i32 (...)*]*> [#uses=1]
>>>>> @_ZTI1SIiE = weak_odr constant %struct.__class_type_info_pseudo { %struct.__type_info_pseudo { i8* inttoptr (i64 add (i64 ptrtoint ([0 x i32 (...)*]* @_ZTVN10__cxxabiv117__class_type_infoE to i64), i64 16) to i8*), i8* getelementptr inbounds ([6 x i8]* @_ZTS1SIiE, i64 0, i64 0) } }, align 16 ; <%struct.__class_type_info_pseudo*> [#uses=1]
>>>>> @_ZTVN10__cxxabiv117__class_type_infoE = external constant [0 x i32 (...)*] ; <[0 x i32 (...)*]*> [#uses=1]
>>>>> @_ZTS1SIiE = weak_odr constant [6 x i8] c"1SIiE\00" ; <[6 x i8]*> [#uses=2]
>>>>> [..]
>>>>>
>>>>>
>>>>> This resulted in an unresolved symbol linker error in Qt.
>>>>
>>>> This should only happen if the method S<int>::m is not instantiated anywhere else in Qt. Is that really the case?
>>>
>>> To be more clear, when using clang, the specific executable being linked fails with linker error because the VTable symbol is not defined in the object files being linked.
>>> With gcc, the VTable is emitted (as in the test case I posted) and the key function is resolved dynamically when the executable is run.
>>
>> But where does the body of the key function come from? Some other library that's loaded dynamically?
>
> Yes, exactly.
>
>>
>> More importantly, did the key function get instantiated somewhere and we failed to emit the vtables + RTTI at that point?
>
> No, it gets instantiated at a library outside of the executable.
That is absolutely disgusting :(
Alright, we're stuck with this approach, then. Thanks for fixing this.
- Doug
More information about the cfe-commits
mailing list