On Tue, Jul 26, 2022 at 10:32:15PM +0200, Rafael Sadowski wrote: > > http://build-failures.rhaalovely.net/sparc64/2022-07-22/x11/qt6/qtdeclarative.log
> https://bugreports.qt.io/browse/QTBUG-100125?gerritReviewStatus=All > OpenSUSE confirmed that with following patch they can build Qt on SPARC: > https://github.com/bmwiedemann/openSUSE/blob/934d586b71984cbf31d8ecb30dc8ac7f90369929/packages/q/qt6-shadertools/0001-Fix-encoding-decoding-of-string-literals-for-big-end.patch > OK? ok kmos --Kurt > Index: Makefile > =================================================================== > RCS file: /cvs/ports/x11/qt6/qtshadertools/Makefile,v > retrieving revision 1.4 > diff -u -p -u -p -r1.4 Makefile > --- Makefile 12 May 2022 09:40:33 -0000 1.4 > +++ Makefile 26 Jul 2022 20:27:24 -0000 > @@ -1,6 +1,7 @@ > QT6NAME = QtShaderTools > > COMMENT = Qt6 shader tools module > +REVISION = 0 > > PKGSPEC = qt6-qtshadertools-${QT6_PKGSPEC} > > Index: patches/patch-src_3rdparty_glslang_SPIRV_SPVRemapper_cpp > =================================================================== > RCS file: patches/patch-src_3rdparty_glslang_SPIRV_SPVRemapper_cpp > diff -N patches/patch-src_3rdparty_glslang_SPIRV_SPVRemapper_cpp > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-src_3rdparty_glslang_SPIRV_SPVRemapper_cpp 26 Jul 2022 > 20:27:24 -0000 > @@ -0,0 +1,39 @@ > +Per SPIR-V spec, a string literal's UTF-8 octets are encoded packed into > +words with little-endian convention. Explicitly perform that encoding > +instead of assuming that the host system is little-endian. > + > +Note that this change requires corresponding fixes in SPIRV-Tools. > + > +Fixes #202 > +https://bugreports.qt.io/browse/QTBUG-100125?gerritReviewStatus=All > +Index: src/3rdparty/glslang/SPIRV/SPVRemapper.cpp > +--- src/3rdparty/glslang/SPIRV/SPVRemapper.cpp.orig > ++++ src/3rdparty/glslang/SPIRV/SPVRemapper.cpp > +@@ -297,15 +297,21 @@ namespace spv { > + std::string spirvbin_t::literalString(unsigned word) const > + { > + std::string literal; > ++ const spirword_t * pos = spv.data() + word; > + > + literal.reserve(16); > + > +- const char* bytes = reinterpret_cast<const char*>(spv.data() + > word); > +- > +- while (bytes && *bytes) > +- literal += *bytes++; > +- > +- return literal; > ++ do { > ++ spirword_t word = *pos; > ++ for (int i = 0; i < 4; i++) { > ++ char c = word & 0xff; > ++ if (c == '\0') > ++ return literal; > ++ literal += c; > ++ word >>= 8; > ++ } > ++ pos++; > ++ } while (true); > + } > + > + void spirvbin_t::applyMap() > Index: patches/patch-src_3rdparty_glslang_SPIRV_disassemble_cpp > =================================================================== > RCS file: patches/patch-src_3rdparty_glslang_SPIRV_disassemble_cpp > diff -N patches/patch-src_3rdparty_glslang_SPIRV_disassemble_cpp > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-src_3rdparty_glslang_SPIRV_disassemble_cpp 26 Jul 2022 > 20:27:24 -0000 > @@ -0,0 +1,104 @@ > +Per SPIR-V spec, a string literal's UTF-8 octets are encoded packed into > +words with little-endian convention. Explicitly perform that encoding > +instead of assuming that the host system is little-endian. > + > +Note that this change requires corresponding fixes in SPIRV-Tools. > + > +Fixes #202 > +https://bugreports.qt.io/browse/QTBUG-100125?gerritReviewStatus=All > +Index: src/3rdparty/glslang/SPIRV/disassemble.cpp > +--- src/3rdparty/glslang/SPIRV/disassemble.cpp.orig > ++++ src/3rdparty/glslang/SPIRV/disassemble.cpp > +@@ -43,6 +43,7 @@ > + #include <stack> > + #include <sstream> > + #include <cstring> > ++#include <utility> > + > + #include "disassemble.h" > + #include "doc.h" > +@@ -100,6 +101,7 @@ class SpirvStream { (protected) > + void outputMask(OperandClass operandClass, unsigned mask); > + void disassembleImmediates(int numOperands); > + void disassembleIds(int numOperands); > ++ std::pair<int, std::string> decodeString(); > + int disassembleString(); > + void disassembleInstruction(Id resultId, Id typeId, Op opCode, int > numOperands); > + > +@@ -290,31 +292,44 @@ void SpirvStream::disassembleIds(int numOperands) > + } > + } > + > +-// return the number of operands consumed by the string > +-int SpirvStream::disassembleString() > ++// decode string from words at current position (non-consuming) > ++std::pair<int, std::string> SpirvStream::decodeString() > + { > +- int startWord = word; > +- > +- out << " \""; > +- > +- const char* wordString; > ++ std::string res; > ++ int wordPos = word; > ++ char c; > + bool done = false; > ++ > + do { > +- unsigned int content = stream[word]; > +- wordString = (const char*)&content; > ++ unsigned int content = stream[wordPos]; > + for (int charCount = 0; charCount < 4; ++charCount) { > +- if (*wordString == 0) { > ++ c = content & 0xff; > ++ content >>= 8; > ++ if (c == '\0') { > + done = true; > + break; > + } > +- out << *(wordString++); > ++ res += c; > + } > +- ++word; > +- } while (! done); > ++ ++wordPos; > ++ } while(! done); > + > ++ return std::make_pair(wordPos - word, res); > ++} > ++ > ++// return the number of operands consumed by the string > ++int SpirvStream::disassembleString() > ++{ > ++ out << " \""; > ++ > ++ std::pair<int, std::string> decoderes = decodeString(); > ++ > ++ out << decoderes.second; > + out << "\""; > + > +- return word - startWord; > ++ word += decoderes.first; > ++ > ++ return decoderes.first; > + } > + > + void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op > opCode, int numOperands) > +@@ -331,7 +346,7 @@ void SpirvStream::disassembleInstruction(Id resultId, > + nextNestedControl = 0; > + } > + } else if (opCode == OpExtInstImport) { > +- idDescriptor[resultId] = (const char*)(&stream[word]); > ++ idDescriptor[resultId] = decodeString().second; > + } > + else { > + if (resultId != 0 && idDescriptor[resultId].size() == 0) { > +@@ -428,7 +443,7 @@ void SpirvStream::disassembleInstruction(Id resultId, > + --numOperands; > + // Get names for printing "(XXX)" for readability, *after* this > id > + if (opCode == OpName) > +- idDescriptor[stream[word - 1]] = (const > char*)(&stream[word]); > ++ idDescriptor[stream[word - 1]] = decodeString().second; > + break; > + case OperandVariableIds: > + disassembleIds(numOperands); > Index: patches/patch-src_3rdparty_glslang_SPIRV_spvIR_h > =================================================================== > RCS file: patches/patch-src_3rdparty_glslang_SPIRV_spvIR_h > diff -N patches/patch-src_3rdparty_glslang_SPIRV_spvIR_h > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-src_3rdparty_glslang_SPIRV_spvIR_h 26 Jul 2022 20:27:24 > -0000 > @@ -0,0 +1,48 @@ > +Per SPIR-V spec, a string literal's UTF-8 octets are encoded packed into > +words with little-endian convention. Explicitly perform that encoding > +instead of assuming that the host system is little-endian. > + > +Note that this change requires corresponding fixes in SPIRV-Tools. > + > +Fixes #202 > +https://bugreports.qt.io/browse/QTBUG-100125?gerritReviewStatus=All > +Index: src/3rdparty/glslang/SPIRV/spvIR.h > +--- src/3rdparty/glslang/SPIRV/spvIR.h.orig > ++++ src/3rdparty/glslang/SPIRV/spvIR.h > +@@ -111,27 +111,23 @@ class Instruction { (public) > + > + void addStringOperand(const char* str) > + { > +- unsigned int word; > +- char* wordString = (char*)&word; > +- char* wordPtr = wordString; > +- int charCount = 0; > ++ unsigned int word = 0; > ++ unsigned int shiftAmount = 0; > + char c; > ++ > + do { > + c = *(str++); > +- *(wordPtr++) = c; > +- ++charCount; > +- if (charCount == 4) { > ++ word |= ((unsigned int)c) << shiftAmount; > ++ shiftAmount += 8; > ++ if (shiftAmount == 32) { > + addImmediateOperand(word); > +- wordPtr = wordString; > +- charCount = 0; > ++ word = 0; > ++ shiftAmount = 0; > + } > + } while (c != 0); > + > + // deal with partial last word > +- if (charCount > 0) { > +- // pad with 0s > +- for (; charCount < 4; ++charCount) > +- *(wordPtr++) = 0; > ++ if (shiftAmount > 0) { > + addImmediateOperand(word); > + } > + }