Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed Kenneth's PHP bug in max/min - was an aliasing bug in sse #56

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 15 additions & 47 deletions TightDB.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>src;src\win32;src\win32\pthread;test\UnitTest++\src;UnitTest++\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;test\UnitTest++\src;UnitTest++\src;src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>TIGHTDB_DEBUG;WIN32;_DEBUG;_CONSOLE;_CRTDBG_MAP_ALLOC;_CRTDBG_MAP_ALLOC_NEW;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
Expand All @@ -187,7 +187,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Static library, debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>src;src\win32;src\win32\pthread;test\UnitTest++\src;UnitTest++\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;test\UnitTest++\src;UnitTest++\src;src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>TIGHTDB_DEBUG;WIN32;_DEBUG;_CONSOLE;_CRTDBG_MAP_ALLOC;_CRTDBG_MAP_ALLOC_NEW;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
Expand All @@ -212,7 +212,7 @@
</Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>src;src\win32;src\win32\pthread;test\UnitTest++\src;UnitTest++\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;test\UnitTest++\src;UnitTest++\src;src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>TIGHTDB_DEBUG;WIN32;_DEBUG;_CONSOLE;_CRTDBG_MAP_ALLOC;_CRTDBG_MAP_ALLOC_NEW;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
Expand All @@ -222,7 +222,7 @@
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<CompileAs>CompileAsCpp</CompileAs>
<AdditionalOptions>/DPTW32_STATIC_LIB /DTIGHTDB_DEBUG /DMAX_LIST_SIZE=1000 %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/DPTW32_STATIC_LIB /DTIGHTDB_DEBUG %(AdditionalOptions)</AdditionalOptions>
<CompileAsManaged>false</CompileAsManaged>
<DisableLanguageExtensions>false</DisableLanguageExtensions>
<DisableSpecificWarnings>4355;4996</DisableSpecificWarnings>
Expand All @@ -242,7 +242,7 @@
</Midl>
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>src;src\win32;src\win32\pthread;test\UnitTest++\src;UnitTest++\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;test\UnitTest++\src;UnitTest++\src;src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>TIGHTDB_DEBUG;WIN32;_DEBUG;_CONSOLE;_CRTDBG_MAP_ALLOC;_CRTDBG_MAP_ALLOC_NEW;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
Expand All @@ -267,7 +267,7 @@
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>src;src\win32;src\win32\pthread;test\UnitTest++\src;UnitTest++\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;test\UnitTest++\src;UnitTest++\src;src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>PTW32_STATIC_LIB;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
Expand All @@ -277,7 +277,6 @@
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalOptions>/DPTW32_STATIC_LIB %(AdditionalOptions)</AdditionalOptions>
<DisableSpecificWarnings>4355;4996</DisableSpecificWarnings>
<BrowseInformation>true</BrowseInformation>
</ClCompile>
<Link>
<AdditionalDependencies>Release\UnitTest++.lib;%(AdditionalDependencies)</AdditionalDependencies>
Expand All @@ -288,15 +287,12 @@
<TargetMachine>MachineX86</TargetMachine>
<AdditionalOptions>WS2_32.lib %(AdditionalOptions)</AdditionalOptions>
</Link>
<Bscmake>
<PreserveSBR>true</PreserveSBR>
</Bscmake>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Static library, release|Win32'">
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>src;src\win32;src\win32\pthread;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
Expand Down Expand Up @@ -327,7 +323,7 @@
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>src;src\win32;src\win32\pthread;test\UnitTest++\src;UnitTest++\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;test\UnitTest++\src;UnitTest++\src;src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>PTW32_STATIC_LIB;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
Expand Down Expand Up @@ -356,7 +352,7 @@
<ClCompile>
<Optimization>Full</Optimization>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>src;src\win32;src\win32\pthread;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>include;src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>false</FunctionLevelLinking>
Expand All @@ -382,7 +378,6 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="src\tightdb\alloc.cpp" />
<ClCompile Include="src\tightdb\alloc_slab.cpp" />
<ClCompile Include="src\tightdb\array.cpp" />
<ClCompile Include="src\tightdb\array_binary.cpp" />
Expand All @@ -403,6 +398,7 @@
<ClCompile Include="src\tightdb\index.cpp" />
<ClCompile Include="src\tightdb\index_string.cpp" />
<ClCompile Include="src\tightdb\query.cpp" />
<ClCompile Include="src\tightdb\replication.cpp" />
<ClCompile Include="src\tightdb\spec.cpp" />
<ClCompile Include="src\tightdb\string_buffer.cpp" />
<ClCompile Include="src\tightdb\table.cpp" />
Expand Down Expand Up @@ -443,7 +439,6 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|x64'">true</ExcludedFromBuild>
<AdditionalOptions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">/DUSE_SSE42 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<ClCompile Include="test\performance\timer.cpp" />
<ClCompile Include="test\testalloc.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|Win32'">true</ExcludedFromBuild>
Expand All @@ -462,12 +457,6 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="test\testarrayfloat.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="test\testarraystring.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|Win32'">true</ExcludedFromBuild>
Expand All @@ -492,12 +481,6 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="test\testcolumnfloat.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="test\testcolumnmixed.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|Win32'">true</ExcludedFromBuild>
Expand Down Expand Up @@ -558,18 +541,8 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="test\testtransactions_lasse.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="test\transactions.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Static library, debug|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="test\testtransactions_lasse.cpp" />
<ClCompile Include="test\transactions.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\tightdb.hpp" />
Expand All @@ -578,21 +551,16 @@
<ClInclude Include="src\tightdb\array.hpp" />
<ClInclude Include="src\tightdb\array_binary.hpp" />
<ClInclude Include="src\tightdb\array_blob.hpp" />
<ClInclude Include="src\tightdb\array_basic.hpp" />
<ClInclude Include="src\tightdb\array_basic_tpl.hpp">
<FileType>CppHeader</FileType>
</ClInclude>
<ClInclude Include="src\tightdb\array_string.hpp" />
<ClInclude Include="src\tightdb\array_string_long.hpp" />
<ClInclude Include="src\tightdb\binary_data.hpp" />
<ClInclude Include="src\tightdb\bind_ptr.hpp" />
<ClInclude Include="src\tightdb\c-table.h" />
<ClInclude Include="src\tightdb\c-tightdb.h" />
<ClInclude Include="src\tightdb\column.hpp" />
<ClInclude Include="src\tightdb\column_binary.hpp" />
<ClInclude Include="src\tightdb\column_fwd.hpp" />
<ClInclude Include="src\tightdb\column_basic.hpp" />
<ClInclude Include="src\tightdb\column_basic_tpl.hpp" />
<ClInclude Include="src\tightdb\column_mixed.hpp" />
<ClInclude Include="src\tightdb\column_mixed_tpl.hpp" />
<ClInclude Include="src\tightdb\column_string.hpp" />
<ClInclude Include="src\tightdb\column_string_enum.hpp" />
<ClInclude Include="src\tightdb\column_table.hpp" />
Expand All @@ -615,7 +583,6 @@
<ClInclude Include="src\tightdb\query_conditions.hpp" />
<ClInclude Include="src\tightdb\query_engine.hpp" />
<ClInclude Include="src\tightdb\replication.hpp" />
<ClInclude Include="src\tightdb\safe_int_ops.hpp" />
<ClInclude Include="src\tightdb\spec.hpp" />
<ClInclude Include="src\tightdb\static_assert.hpp" />
<ClInclude Include="src\tightdb\string_buffer.hpp" />
Expand All @@ -626,6 +593,7 @@
<ClInclude Include="src\tightdb\table_ref.hpp" />
<ClInclude Include="src\tightdb\table_view.hpp" />
<ClInclude Include="src\tightdb\table_view_basic.hpp" />
<ClInclude Include="src\tightdb\tightdb-c.h" />
<ClInclude Include="src\tightdb\tightdb_nmmintrin.h" />
<ClInclude Include="src\tightdb\tuple.hpp" />
<ClInclude Include="src\tightdb\type_list.hpp" />
Expand Down
65 changes: 62 additions & 3 deletions src/tightdb/alloc_slab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,9 +323,68 @@ void SlabAlloc::attach_buffer(char* data, size_t size, bool take_ownership)
// Verify the data structures
if (!validate_buffer(data, size)) throw InvalidDatabase();

m_data = data;
m_baseline = size;
m_free_mode = take_ownership ? free_Unalloc : free_Noop;
// Open file
DWORD error_copy;
{
const DWORD desired_access = read_only ? GENERIC_READ : GENERIC_READ|GENERIC_WRITE;
const DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE; // FIXME: Should probably be zero if we are called from a group that is not managed by a SharedGroup instance, since in this case concurrenct access is prohibited anyway.
const DWORD creation_disposition = read_only || no_create ? OPEN_EXISTING : OPEN_ALWAYS;
m_file = CreateFileA(path.c_str(), desired_access, share_mode, NULL,
creation_disposition, NULL, NULL);
if (m_file == INVALID_HANDLE_VALUE) {
error_copy = GetLastError();
goto open_error;
}

CloseGuard cg(m_file);

// Map to memory (read only)
m_map_file = CreateFileMapping(m_file, NULL, PAGE_WRITECOPY, 0, 0, 0);
if (m_map_file == NULL) goto create_map_error;

CloseGuard cg2(m_map_file);

const LPVOID p = MapViewOfFile(m_map_file, FILE_MAP_COPY, 0, 0, 0);
if (!p) goto map_view_error;

// Get Size
LARGE_INTEGER size;
if (!GetFileSizeEx(m_file, &size)) goto get_size_error;
m_baseline = to_ref(size.QuadPart);

UnmapGuard ug(p);

// Verify the data structures
if (!validate_buffer(static_cast<char*>(p), m_baseline)) goto invalid_database;

m_shared = static_cast<char*>(p);

cg.release();
cg2.release();
ug.release();
}

return;

open_error:
switch (error_copy) {
case ERROR_FILE_NOT_FOUND: throw NoSuchFile();
// FIXME: What error codes should cause PermissionDenied to be thrown? What kind of permission violations are even possible on Windows?
}
throw runtime_error("CreateFile() failed");

create_map_error:
throw runtime_error("CreateFileMapping() failed");

map_view_error:
throw runtime_error("MapViewOfFile() failed");

get_size_error:
throw runtime_error("GetFileSizeEx() failed");

invalid_database:
throw InvalidDatabase();
#endif
}


Expand Down
6 changes: 6 additions & 0 deletions src/tightdb/alloc_slab.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,12 @@ class SlabAlloc: public Allocator {
void FreeAll(size_t filesize=(size_t)-1);
bool ReMap(size_t filesize); // Returns false if remapping was not necessary

#ifndef _MSC_VER
int GetFileDescriptor() {return m_fd;}
#else
void* GetFileDescriptor() {return m_file;}
#endif

#ifdef TIGHTDB_DEBUG
void EnableDebug(bool enable) {m_debugOut = enable;}
void Verify() const;
Expand Down
12 changes: 9 additions & 3 deletions src/tightdb/array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -843,7 +843,7 @@ template <bool find_max, size_t w> bool Array::minmax(int64_t& result, size_t st
if ((w == 8 || w == 16 || w == 32) && end - start > 2 * sizeof(__m128i) * 8 / NO0(w)) {
__m128i *data = (__m128i *)(m_data + start * w / 8);
__m128i state = data[0];
__m128i state2;
char state2[sizeof(state)];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm pretty sure that changing the type of state2 has no effect on the aliasing issue. I believe what fixes the aliasing bug is the fact that memcpy() modifies state2 as though it was a character array. I would love to see what happens when reverting state2 back to __m128i. Hopefully nothing.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please ignore my comments on aliasing. My theory turned out to be wrong.


size_t chunks = (end - start) * w / 8 / sizeof(__m128i);
for (size_t t = 0; t < chunks; t++) {
Expand All @@ -857,8 +857,14 @@ template <bool find_max, size_t w> bool Array::minmax(int64_t& result, size_t st
start += sizeof(__m128i) * 8 / NO0(w);
}

// prevent taking address of 'state' to make the compiler keep it in SSE register in above loop (vc2010/gcc4.6)
state2 = state;
// Todo: prevent taking address of 'state' to make the compiler keep it in SSE register in above loop (vc2010/gcc4.6)

// We originally had declared '__m128i state2' and did an 'state2 = state' assignment. When we read from state2 through int16_t, int32_t or int64_t in GetUniversal(),
// the compiler thinks it cannot alias state2 and hence reorders the read and assignment.

// In this fixed version using memcpy, we have char-read-access from __m128i (OK aliasing) and char-write-access to char-array, and finally int8/16/32/64
// read access from char-array (OK aliasing).
memcpy(&state2, &state, sizeof(state));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding to my previous comment, I believe that if the memcpy() was changed to

reinterpret_cast<__m128i&>(state2) = state;

then the aliasing bug would be reintroduced. My point is that it is not the type of the accessed memory that matters, but rather the (possibly punned) type through which that memory is accessed.

for (size_t t = 0; t < sizeof(__m128i) * 8 / NO0(w); ++t) {
const int64_t v = GetUniversal<w>(((const char *)&state2), t);
if (find_max ? v > m : v < m) {
Expand Down
4 changes: 2 additions & 2 deletions src/tightdb/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@
* value, be sure to also change TIGHTDB_DEFAULT_MAX_LIST_SIZE. */
/* FIXME: Must be prefixed with TIGHTDB_ */
#ifndef MAX_LIST_SIZE
# define MAX_LIST_SIZE 1000
# define MAX_LIST_SIZE 3
#endif
/* This one is needed to allow tightdb-config to know whether a
* nondefault value is in effect. It MUST always be equal to the
* fallback value of MAX_LIST_SIZE as pecified above. */
#define TIGHTDB_DEFAULT_MAX_LIST_SIZE 1000
#define TIGHTDB_DEFAULT_MAX_LIST_SIZE 3


/* GCC defines __GXX_RTTI when '-fno-rtti' is not specified. The same
Expand Down
Loading