[llvm-bugs] [Bug 29116] New: typeinfo structure badly generated for MinGW-w64/x86_64 makes dynamic_cast<>() fail

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Aug 24 00:54:58 PDT 2016


https://llvm.org/bugs/show_bug.cgi?id=29116

            Bug ID: 29116
           Summary: typeinfo structure badly generated for
                    MinGW-w64/x86_64 makes dynamic_cast<>() fail
           Product: clang
           Version: 3.8
          Hardware: PC
                OS: Windows XP
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++
          Assignee: unassignedclangbugs at nondot.org
          Reporter: eric.paire at st.com
                CC: dgregor at apple.com, llvm-bugs at lists.llvm.org
    Classification: Unclassified

Hi all,

I am using clang-3.8.0 under MinGW-w64, and I found a problem of C++ typeinfo
structure generation while targeting 64-bit code generation, that correctly
works while targeting 32-bit one:

Here is a copy of the typeinfo structure generated for a class called
'sc_core::sc_signal_in_if<float>' for x86_64/MinGW-w64 target:

_ZTIN7sc_core15sc_signal_in_ifIfEE:
        .quad   _ZTVN10__cxxabiv121__vmi_class_type_infoE+16
        .quad   _ZTSN7sc_core15sc_signal_in_ifIfEE
        .long   0                       # 0x0
        .long   1                       # 0x1
        .quad   _ZTIN7sc_core12sc_interfaceE
        .long   4294955011              # 0xffffd003
        .zero   4

while the same structure generated by gcc-6.1.0/MinGW-w64 is the following:

_ZTIN7sc_core18sc_signal_write_ifIfEE:
        .quad   _ZTVN10__cxxabiv121__vmi_class_type_infoE+16
        .quad   _ZTSN7sc_core18sc_signal_write_ifIfEE
        .long   0
        .long   1
        .quad   _ZTIN7sc_core12sc_interfaceE
        .quad   -12285

What clearly appears here is that the last '.quad' value of the typeinfo
structure is badly generated for clang-3.8.0/MinGW-w64 because it is not
negative but positive, as the sign is not extended to the most significant 32
bits... which makes some dynamic_cast<>() fail in my application (too complex
to be copied here, although open source, as extracted from Accelera SystemC
package).

Notice also that the clang-3.8.0 generation targeted at x86_64/Linux is correct
(almost same assembler as for gcc-6.1.0/MinGW-w64):

_ZTIN7sc_core15sc_signal_in_ifIfEE:
        .quad   _ZTVN10__cxxabiv121__vmi_class_type_infoE+16
        .quad   _ZTSN7sc_core15sc_signal_in_ifIfEE
        .long   0                       # 0x0
        .long   1                       # 0x1
        .quad   _ZTIN7sc_core12sc_interfaceE
        .quad   -12285                  # 0xffffffffffffd003
        .size   _ZTIN7sc_core15sc_signal_in_ifIfEE, 40

I let someone who knows the Clang back-end generator provide the official fix.

Thanks in advance,
Eric PAIRE

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160824/bf177219/attachment.html>


More information about the llvm-bugs mailing list