From 05d401104ee6b10699b7288ead044d6765b19c4d Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 17 Sep 2015 11:35:36 -0700 Subject: Fix QtCore compilation with clang The .altmacro is not supported with Clang's integrated assembly. The worst part is that I had this fixed, but apparently I never pushed the update to Gerrit and then we staged the old version. This commit brings back the fixes. Incidentally, it also makes things work with freebsd-clang. Change-Id: Id2a5d90d07d7ee470fcb9ad9696a9a0f9ced7ea7 Reviewed-by: Lars Knoll Reviewed-by: Simon Hausmann --- src/corelib/global/global.pri | 28 ++++++++++++++++++++++++++-- src/corelib/global/qversiontagging.cpp | 15 +++++++++++---- 2 files changed, 37 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/corelib/global/global.pri b/src/corelib/global/global.pri index 8ecde5a769..eb8600f796 100644 --- a/src/corelib/global/global.pri +++ b/src/corelib/global/global.pri @@ -27,8 +27,7 @@ SOURCES += \ global/qmalloc.cpp \ global/qnumeric.cpp \ global/qlogging.cpp \ - global/qhooks.cpp \ - global/qversiontagging.cpp + global/qhooks.cpp # qlibraryinfo.cpp includes qconfig.cpp INCLUDEPATH += $$QT_BUILD_TREE/src/corelib/global @@ -59,3 +58,28 @@ journald { syslog { DEFINES += QT_USE_SYSLOG } + +linux|freebsd { + VERSIONTAGGING_SOURCES = global/qversiontagging.cpp + ltcg|clang { + versiontagging_compiler.commands = $$QMAKE_CXX -c $(CXXFLAGS) $(INCPATH) + + # Disable LTO, as the global inline assembly may not get processed + versiontagging_compiler.commands += -fno-lto + + # Disable the integrated assembler for Clang, since it can't parse with + # the alternate macro syntax in use in qversiontagging.cpp + clang: versiontagging_compiler.commands += -no-integrated-as + + versiontagging_compiler.commands += -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} + versiontagging_compiler.dependency_type = TYPE_C + versiontagging_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)} + versiontagging_compiler.input = VERSIONTAGGING_SOURCES + versiontagging_compiler.variable_out = OBJECTS + versiontagging_compiler.name = compiling[versiontagging] ${QMAKE_FILE_IN} + silent: versiontagging_compiler.commands = @echo compiling[versiontagging] ${QMAKE_FILE_IN} && $$versiontagging_compiler.commands + QMAKE_EXTRA_COMPILERS += versiontagging_compiler + } else { + SOURCES += $$VERSIONTAGGING_SOURCES + } +} diff --git a/src/corelib/global/qversiontagging.cpp b/src/corelib/global/qversiontagging.cpp index e3d9efa16b..66d3f8d00f 100644 --- a/src/corelib/global/qversiontagging.cpp +++ b/src/corelib/global/qversiontagging.cpp @@ -33,18 +33,25 @@ #include "qglobal.h" -#if defined(Q_CC_GNU) && defined(Q_OS_LINUX) && defined(Q_PROCESSOR_X86) && !defined(QT_STATIC) +#if defined(Q_CC_GNU) && (defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD)) && defined(Q_PROCESSOR_X86) && !defined(QT_STATIC) # define SYM QT_MANGLE_NAMESPACE(qt_version_tag) # define SSYM QT_STRINGIFY(SYM) asm( +// ASM macro that makes one ELF versioned symbol +".macro make_versioned_symbol plainsym versionedsym\n" +".globl plainsym\n" +".type plainsym, @object\n" +".size plainsym, 1\n" +".symver plainsym, versionedsym\n" +"plainsym :\n" +".endm\n" + // ASM macro that makes one ELF versioned symbol qt_version_tag{sep}Qt_{major}.{minor} // that is an alias to qt_version_tag_{major}_{minor}. // The {sep} parameter must be @ for all old versions and @@ for the current version. ".macro make_one_tag major minor sep\n" -".globl " SSYM "_\\major\\()_\\minor\n" // make the symbol global -SSYM "_\\major\\()_\\minor:\n" // declare it -" .symver " SSYM "_\\major\\()_\\minor, " SSYM "\\sep\\()Qt_\\major\\().\\minor\n" +" make_versioned_symbol " SSYM "_\\major\\()_\\minor, " SSYM "\\sep\\()Qt_\\major\\().\\minor\n" ".endm\n" ".altmacro\n" -- cgit v1.2.3