From 77d04598d37facab359f6473d26c71d20b14d480 Mon Sep 17 00:00:00 2001 From: St0fF Date: Mon, 9 Apr 2018 17:37:01 +0200 Subject: [PATCH 1/4] fix VS2012 compile issues small fixes needed to compile under Win8.1/VS2012/static_lib --- glslang/Include/Common.h | 25 +++++++++++---------- glslang/MachineIndependent/Intermediate.cpp | 1 + 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/glslang/Include/Common.h b/glslang/Include/Common.h index f2fb10bf..5fe0f270 100644 --- a/glslang/Include/Common.h +++ b/glslang/Include/Common.h @@ -67,18 +67,19 @@ std::string to_string(const T& val) { #endif #if defined(_MSC_VER) && _MSC_VER < 1800 -inline long long int strtoll (const char* str, char** endptr, int base) -{ - return _strtoi64(str, endptr, base); -} -inline unsigned long long int strtoull (const char* str, char** endptr, int base) -{ - return _strtoui64(str, endptr, base); -} -inline long long int atoll (const char* str) -{ - return strtoll(str, NULL, 10); -} + #include + inline long long int strtoll (const char* str, char** endptr, int base) + { + return _strtoi64(str, endptr, base); + } + inline unsigned long long int strtoull (const char* str, char** endptr, int base) + { + return _strtoui64(str, endptr, base); + } + inline long long int atoll (const char* str) + { + return strtoll(str, NULL, 10); + } #endif #if defined(_MSC_VER) diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp index 9e5beaca..0333e5d0 100644 --- a/glslang/MachineIndependent/Intermediate.cpp +++ b/glslang/MachineIndependent/Intermediate.cpp @@ -47,6 +47,7 @@ #include #include +#include namespace glslang { From e7350423067442f616431c1cdf4f18dd7990a491 Mon Sep 17 00:00:00 2001 From: St0fF Date: Mon, 9 Apr 2018 19:28:45 +0200 Subject: [PATCH 2/4] add ability to record accessed and declared "named defines" Added the needed 2 sets to TIntermediate, added accessor-functions, inserter functions. Implemented recording of such named defines inside the preprocessor parser. --- glslang/MachineIndependent/Intermediate.cpp | 11 +++++++++++ glslang/MachineIndependent/localintermediate.h | 9 +++++++++ glslang/MachineIndependent/preprocessor/Pp.cpp | 15 +++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp index 0333e5d0..7f4d7d06 100644 --- a/glslang/MachineIndependent/Intermediate.cpp +++ b/glslang/MachineIndependent/Intermediate.cpp @@ -3812,4 +3812,15 @@ const char* TIntermediate::getResourceName(TResourceType res) } +// Access recorded named preprocessor-defines from the outside +// -> needs to take into account, that the outside may want to use the set +// even after the memory pool got released +void TIntermediate::getAddDefines( std::unordered_set< std::string > &targetSet, const std::unordered_set< TString > &sourceSet ) const +{ + targetSet.reserve( targetSet.size() + sourceSet.size() ); + for ( auto &i: sourceSet ) + targetSet.emplace( i.c_str() ); // need to convert from TString (pool-allocated) to normal std::basic_string, so it may be used after the pool is released +} + + } // end namespace glslang diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h index 17e07651..28509e62 100644 --- a/glslang/MachineIndependent/localintermediate.h +++ b/glslang/MachineIndependent/localintermediate.h @@ -637,6 +637,11 @@ public: const char* const implicitThisName; const char* const implicitCounterName; + void insertAccessedNamedDefine( const char *defName ) { accessedNamedDefines.emplace( defName ); } + void insertDeclaredNamedDefine( const char *defName ) { declaredNamedDefines.emplace( defName ); } + void getAddAccessedNamedDefines( std::unordered_set< std::string > &targetSet ) const { getAddDefines( targetSet, accessedNamedDefines ); } + void getAddDeclaredNamedDefines( std::unordered_set< std::string > &targetSet ) const { getAddDefines( targetSet, declaredNamedDefines ); } + protected: TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&); void error(TInfoSink& infoSink, const char*); @@ -665,6 +670,7 @@ protected: std::tuple getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const; bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();} static const char* getResourceName(TResourceType); + void getAddDefines( std::unordered_set< std::string > &targetSet, const std::unordered_set< TString > &sourceSet ) const; const EShLanguage language; // stage, known at construction time EShSource source; // source language, known a bit later @@ -743,6 +749,9 @@ protected: bool needToLegalize; + // storage for (accessed/declared) "named defines" + std::unordered_set< TString > accessedNamedDefines, declaredNamedDefines; + private: void operator=(TIntermediate&); // prevent assignments }; diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp index 8048fa51..b7560846 100644 --- a/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -102,7 +102,8 @@ int TPpContext::CPPdefine(TPpToken* ppToken) parseContext.ppError(ppToken->loc, "must be followed by macro name", "#define", ""); return token; } - if (ppToken->loc.string >= 0) { + bool inUserCode(ppToken->loc.string >= 0); + if (inUserCode) { // We are in user code; check for reserved name use: parseContext.reservedPpErrorCheck(ppToken->loc, ppToken->name, "#define"); } @@ -186,8 +187,11 @@ int TPpContext::CPPdefine(TPpToken* ppToken) } } *existing = mac; - } else - addMacroDef(defAtom, mac); + } else { + addMacroDef(defAtom, mac); + if ( inUserCode && mac.args.empty() && mac.body.atEnd() ) + parseContext.intermediate.insertDeclaredNamedDefine( atomStrings.getString( defAtom ) ); + } return '\n'; } @@ -248,6 +252,8 @@ int TPpContext::CPPelse(int matchelse, TPpToken* ppToken) } else { ifdepth++; elsetracker++; + if ( nextAtom != PpAtomIf && scanToken( ppToken ) == PpAtomIdentifier ) + parseContext.intermediate.insertAccessedNamedDefine( ppToken->name ); } } else if (nextAtom == PpAtomEndif) { token = extraTokenCheck(nextAtom, ppToken, scanToken(ppToken)); @@ -420,7 +426,7 @@ int TPpContext::eval(int token, int precedence, bool shortCircuit, int& res, boo return token; } - + parseContext.intermediate.insertAccessedNamedDefine( ppToken->name ); MacroSymbol* macro = lookupMacroDef(atomStrings.getAtom(ppToken->name)); res = macro != nullptr ? !macro->undef : 0; token = scanToken(ppToken); @@ -577,6 +583,7 @@ int TPpContext::CPPifdef(int defined, TPpToken* ppToken) else parseContext.ppError(ppToken->loc, "must be followed by macro name", "#ifndef", ""); } else { + parseContext.intermediate.insertAccessedNamedDefine( ppToken->name ); MacroSymbol* macro = lookupMacroDef(atomStrings.getAtom(ppToken->name)); token = scanToken(ppToken); if (token != '\n') { From a1184ddd48fc3f136929b343554c4f85a7a496c9 Mon Sep 17 00:00:00 2001 From: St0fF Date: Mon, 9 Apr 2018 21:08:14 +0200 Subject: [PATCH 3/4] fix further MSVC 2012 build issues MSVC 2012 does not allow initializer lists - replaced with corrresponding CTor calls. --- SPIRV/GlslangToSpv.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 6a28a1c1..95b507b1 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -3638,7 +3638,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO if (builder.getImageTypeFormat(builder.getImageType(operands.front())) == spv::ImageFormatUnknown) builder.addCapability(spv::CapabilityStorageImageReadWithoutFormat); - std::vector result = { builder.createOp(spv::OpImageRead, resultType(), operands) }; + std::vector result( 1, builder.createOp(spv::OpImageRead, resultType(), operands) ); builder.setPrecision(result[0], precision); // If needed, add a conversion constructor to the proper size. @@ -3926,9 +3926,9 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO } } - std::vector result = { + std::vector result( 1, builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, noImplicitLod, params) - }; + ); if (components != node->getType().getVectorSize()) result[0] = builder.createConstructor(precision, result, convertGlslangToSpvType(node->getType())); From 1aaa3567d98fff5641c4ce450997f87783eaa598 Mon Sep 17 00:00:00 2001 From: St0fF Date: Tue, 10 Apr 2018 14:44:23 +0200 Subject: [PATCH 4/4] Revert "add ability to record accessed and declared "named defines"" This reverts commit e7350423067442f616431c1cdf4f18dd7990a491. --- glslang/MachineIndependent/Intermediate.cpp | 11 ----------- glslang/MachineIndependent/localintermediate.h | 9 --------- glslang/MachineIndependent/preprocessor/Pp.cpp | 15 ++++----------- 3 files changed, 4 insertions(+), 31 deletions(-) diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp index 7f4d7d06..0333e5d0 100644 --- a/glslang/MachineIndependent/Intermediate.cpp +++ b/glslang/MachineIndependent/Intermediate.cpp @@ -3812,15 +3812,4 @@ const char* TIntermediate::getResourceName(TResourceType res) } -// Access recorded named preprocessor-defines from the outside -// -> needs to take into account, that the outside may want to use the set -// even after the memory pool got released -void TIntermediate::getAddDefines( std::unordered_set< std::string > &targetSet, const std::unordered_set< TString > &sourceSet ) const -{ - targetSet.reserve( targetSet.size() + sourceSet.size() ); - for ( auto &i: sourceSet ) - targetSet.emplace( i.c_str() ); // need to convert from TString (pool-allocated) to normal std::basic_string, so it may be used after the pool is released -} - - } // end namespace glslang diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h index 28509e62..17e07651 100644 --- a/glslang/MachineIndependent/localintermediate.h +++ b/glslang/MachineIndependent/localintermediate.h @@ -637,11 +637,6 @@ public: const char* const implicitThisName; const char* const implicitCounterName; - void insertAccessedNamedDefine( const char *defName ) { accessedNamedDefines.emplace( defName ); } - void insertDeclaredNamedDefine( const char *defName ) { declaredNamedDefines.emplace( defName ); } - void getAddAccessedNamedDefines( std::unordered_set< std::string > &targetSet ) const { getAddDefines( targetSet, accessedNamedDefines ); } - void getAddDeclaredNamedDefines( std::unordered_set< std::string > &targetSet ) const { getAddDefines( targetSet, declaredNamedDefines ); } - protected: TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&); void error(TInfoSink& infoSink, const char*); @@ -670,7 +665,6 @@ protected: std::tuple getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const; bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();} static const char* getResourceName(TResourceType); - void getAddDefines( std::unordered_set< std::string > &targetSet, const std::unordered_set< TString > &sourceSet ) const; const EShLanguage language; // stage, known at construction time EShSource source; // source language, known a bit later @@ -749,9 +743,6 @@ protected: bool needToLegalize; - // storage for (accessed/declared) "named defines" - std::unordered_set< TString > accessedNamedDefines, declaredNamedDefines; - private: void operator=(TIntermediate&); // prevent assignments }; diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp index b7560846..8048fa51 100644 --- a/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -102,8 +102,7 @@ int TPpContext::CPPdefine(TPpToken* ppToken) parseContext.ppError(ppToken->loc, "must be followed by macro name", "#define", ""); return token; } - bool inUserCode(ppToken->loc.string >= 0); - if (inUserCode) { + if (ppToken->loc.string >= 0) { // We are in user code; check for reserved name use: parseContext.reservedPpErrorCheck(ppToken->loc, ppToken->name, "#define"); } @@ -187,11 +186,8 @@ int TPpContext::CPPdefine(TPpToken* ppToken) } } *existing = mac; - } else { - addMacroDef(defAtom, mac); - if ( inUserCode && mac.args.empty() && mac.body.atEnd() ) - parseContext.intermediate.insertDeclaredNamedDefine( atomStrings.getString( defAtom ) ); - } + } else + addMacroDef(defAtom, mac); return '\n'; } @@ -252,8 +248,6 @@ int TPpContext::CPPelse(int matchelse, TPpToken* ppToken) } else { ifdepth++; elsetracker++; - if ( nextAtom != PpAtomIf && scanToken( ppToken ) == PpAtomIdentifier ) - parseContext.intermediate.insertAccessedNamedDefine( ppToken->name ); } } else if (nextAtom == PpAtomEndif) { token = extraTokenCheck(nextAtom, ppToken, scanToken(ppToken)); @@ -426,7 +420,7 @@ int TPpContext::eval(int token, int precedence, bool shortCircuit, int& res, boo return token; } - parseContext.intermediate.insertAccessedNamedDefine( ppToken->name ); + MacroSymbol* macro = lookupMacroDef(atomStrings.getAtom(ppToken->name)); res = macro != nullptr ? !macro->undef : 0; token = scanToken(ppToken); @@ -583,7 +577,6 @@ int TPpContext::CPPifdef(int defined, TPpToken* ppToken) else parseContext.ppError(ppToken->loc, "must be followed by macro name", "#ifndef", ""); } else { - parseContext.intermediate.insertAccessedNamedDefine( ppToken->name ); MacroSymbol* macro = lookupMacroDef(atomStrings.getAtom(ppToken->name)); token = scanToken(ppToken); if (token != '\n') {