(glslang) Further simplifications of InfoSink - get rid of message() and prefix() -

we want simple string concatenation/addition instead of all these layers
This commit is contained in:
LibretroAdmin 2022-07-31 16:37:49 +02:00
parent a2e525a1b6
commit a176a935da
9 changed files with 65 additions and 63 deletions

View File

@ -76,17 +76,6 @@ public:
TInfoSinkBase& operator<<(const TString& t) { append(t); return *this; } TInfoSinkBase& operator<<(const TString& t) { append(t); return *this; }
TInfoSinkBase& operator+(const char* s) { append(s); return *this; } TInfoSinkBase& operator+(const char* s) { append(s); return *this; }
const char* c_str() const { return sink.c_str(); } const char* c_str() const { return sink.c_str(); }
void prefix(TPrefixType message) {
switch(message) {
case EPrefixNone: break;
case EPrefixWarning: append("WARNING: "); break;
case EPrefixError: append("ERROR: "); break;
case EPrefixInternalError: append("INTERNAL ERROR: "); break;
case EPrefixUnimplemented: append("UNIMPLEMENTED: "); break;
case EPrefixNote: append("NOTE: "); break;
default: append("UNKNOWN ERROR: "); break;
}
}
void location(const TSourceLoc& loc) { void location(const TSourceLoc& loc) {
char locText[24]; char locText[24];
snprintf(locText, 24, ":%d", loc.line); snprintf(locText, 24, ":%d", loc.line);
@ -94,12 +83,6 @@ public:
append(locText); append(locText);
append(": "); append(": ");
} }
void message(TPrefixType message, const char* s, const TSourceLoc& loc) {
prefix(message);
location(loc);
append(s);
append("\n");
}
void append(const char* s); void append(const char* s);

View File

@ -44,29 +44,6 @@ extern int yyparse(glslang::TParseContext*);
namespace glslang { namespace glslang {
//
// Used to output syntax, parsing, and semantic errors.
//
void TParseContextBase::outputMessage(const TSourceLoc& loc, const char* szReason,
const char* szToken,
const char* szExtraInfoFormat,
TPrefixType prefix, va_list args)
{
const int maxSize = MaxTokenLength + 200;
char szExtraInfo[maxSize];
safe_vsprintf(szExtraInfo, maxSize, szExtraInfoFormat, args);
infoSink.info.prefix(prefix);
infoSink.info.location(loc);
infoSink.info << "'" << szToken << "' : " << szReason << " " << szExtraInfo << "\n";
if (prefix == EPrefixError) {
++numErrors;
}
}
void C_DECL TParseContextBase::error(const TSourceLoc& loc, const char* szReason, const char* szToken, void C_DECL TParseContextBase::error(const TSourceLoc& loc, const char* szReason, const char* szToken,
const char* szExtraInfoFormat, ...) const char* szExtraInfoFormat, ...)
{ {
@ -74,7 +51,13 @@ void C_DECL TParseContextBase::error(const TSourceLoc& loc, const char* szReason
return; return;
va_list args; va_list args;
va_start(args, szExtraInfoFormat); va_start(args, szExtraInfoFormat);
outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixError, args); const int maxSize = MaxTokenLength + 200;
char szExtraInfo[maxSize];
safe_vsprintf(szExtraInfo, maxSize, szExtraInfoFormat, args);
infoSink.info.append("ERROR: ");
infoSink.info.location(loc);
infoSink.info << "'" << szToken << "' : " << szReason << " " << szExtraInfo << "\n";
++numErrors;
va_end(args); va_end(args);
if ((messages & EShMsgCascadingErrors) == 0) if ((messages & EShMsgCascadingErrors) == 0)
@ -88,7 +71,12 @@ void C_DECL TParseContextBase::warn(const TSourceLoc& loc, const char* szReason,
return; return;
va_list args; va_list args;
va_start(args, szExtraInfoFormat); va_start(args, szExtraInfoFormat);
outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixWarning, args); const int maxSize = MaxTokenLength + 200;
char szExtraInfo[maxSize];
safe_vsprintf(szExtraInfo, maxSize, szExtraInfoFormat, args);
infoSink.info.append("WARNING: ");
infoSink.info.location(loc);
infoSink.info << "'" << szToken << "' : " << szReason << " " << szExtraInfo << "\n";
va_end(args); va_end(args);
} }
@ -97,7 +85,13 @@ void C_DECL TParseContextBase::ppError(const TSourceLoc& loc, const char* szReas
{ {
va_list args; va_list args;
va_start(args, szExtraInfoFormat); va_start(args, szExtraInfoFormat);
outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixError, args); const int maxSize = MaxTokenLength + 200;
char szExtraInfo[maxSize];
safe_vsprintf(szExtraInfo, maxSize, szExtraInfoFormat, args);
infoSink.info.append("ERROR: ");
infoSink.info.location(loc);
infoSink.info << "'" << szToken << "' : " << szReason << " " << szExtraInfo << "\n";
++numErrors;
va_end(args); va_end(args);
if ((messages & EShMsgCascadingErrors) == 0) if ((messages & EShMsgCascadingErrors) == 0)
@ -109,7 +103,12 @@ void C_DECL TParseContextBase::ppWarn(const TSourceLoc& loc, const char* szReaso
{ {
va_list args; va_list args;
va_start(args, szExtraInfoFormat); va_start(args, szExtraInfoFormat);
outputMessage(loc, szReason, szToken, szExtraInfoFormat, EPrefixWarning, args); const int maxSize = MaxTokenLength + 200;
char szExtraInfo[maxSize];
safe_vsprintf(szExtraInfo, maxSize, szExtraInfoFormat, args);
infoSink.info.append("WARNING: ");
infoSink.info.location(loc);
infoSink.info << "'" << szToken << "' : " << szReason << " " << szExtraInfo << "\n";
va_end(args); va_end(args);
} }

View File

@ -220,9 +220,6 @@ protected:
virtual const char* getGlobalUniformBlockName() const { return ""; } virtual const char* getGlobalUniformBlockName() const { return ""; }
virtual void setUniformBlockDefaults(TType&) const { } virtual void setUniformBlockDefaults(TType&) const { }
virtual void finalizeGlobalUniformBlockLayout(TVariable&) { } virtual void finalizeGlobalUniformBlockLayout(TVariable&) { }
virtual void outputMessage(const TSourceLoc&, const char* szReason, const char* szToken,
const char* szExtraInfoFormat, TPrefixType prefix,
va_list args);
virtual void trackLinkage(TSymbol& symbol); virtual void trackLinkage(TSymbol& symbol);
virtual void makeEditable(TSymbol*&); virtual void makeEditable(TSymbol*&);
virtual TVariable* getEditableVariable(const char* name); virtual TVariable* getEditableVariable(const char* name);

View File

@ -1506,7 +1506,10 @@ int TScanContext::tokenizeIdentifier()
} }
default: default:
_parseContext.infoSink.info.message(EPrefixInternalError, "Unknown glslang keyword", loc); _parseContext.infoSink.info.append("INTERNAL ERROR: ");
_parseContext.infoSink.info.location(loc);
_parseContext.infoSink.info.append("Unknown glslang keyword");
_parseContext.infoSink.info.append("\n");
return 0; return 0;
} }
} }

View File

@ -1101,7 +1101,7 @@ struct DoPreprocessing {
bool success = true; bool success = true;
if (_parseContext.getNumErrors() > 0) { if (_parseContext.getNumErrors() > 0) {
success = false; success = false;
_parseContext.infoSink.info.prefix(EPrefixError); _parseContext.infoSink.info.append("ERROR: ");
_parseContext.infoSink.info << _parseContext.getNumErrors() << " compilation errors. No code generated.\n\n"; _parseContext.infoSink.info << _parseContext.getNumErrors() << " compilation errors. No code generated.\n\n";
} }
return success; return success;
@ -1132,7 +1132,7 @@ struct DoFullParse{
else else
success = intermediate.postProcess(intermediate.getTreeRoot(), _parseContext.getLanguage()); success = intermediate.postProcess(intermediate.getTreeRoot(), _parseContext.getLanguage());
} else if (! success) { } else if (! success) {
_parseContext.infoSink.info.prefix(EPrefixError); _parseContext.infoSink.info.append("ERROR: ");
_parseContext.infoSink.info << _parseContext.getNumErrors() << " compilation errors. No code generated.\n\n"; _parseContext.infoSink.info << _parseContext.getNumErrors() << " compilation errors. No code generated.\n\n";
} }

View File

@ -510,7 +510,10 @@ void TParseVersions::profileRequires(const TSourceLoc& loc, int profileMask, int
for (int i = 0; i < numExtensions; ++i) { for (int i = 0; i < numExtensions; ++i) {
switch (getExtensionBehavior(extensions[i])) { switch (getExtensionBehavior(extensions[i])) {
case EBhWarn: case EBhWarn:
infoSink.info.message(EPrefixWarning, ("extension " + TString(extensions[i]) + " is being used for " + featureDesc).c_str(), loc); infoSink.info.append("WARNING: ");
infoSink.info.location(loc);
infoSink.info.append(("extension " + TString(extensions[i]) + " is being used for " + featureDesc).c_str());
infoSink.info.append("\n");
// fall through // fall through
case EBhRequire: case EBhRequire:
case EBhEnable: case EBhEnable:
@ -562,8 +565,13 @@ void TParseVersions::checkDeprecated(const TSourceLoc& loc, int profileMask, int
if (forwardCompatible) if (forwardCompatible)
error(loc, "deprecated, may be removed in future release", featureDesc, ""); error(loc, "deprecated, may be removed in future release", featureDesc, "");
else if (! suppressWarnings()) else if (! suppressWarnings())
infoSink.info.message(EPrefixWarning, (TString(featureDesc) + " deprecated in version " + {
String(depVersion) + "; may be removed in future release").c_str(), loc); infoSink.info.append("WARNING: ");
infoSink.info.location(loc);
infoSink.info.append((TString(featureDesc) + " deprecated in version " +
String(depVersion) + "; may be removed in future release").c_str());
infoSink.info.append("\n");
}
} }
} }
} }
@ -605,11 +613,17 @@ bool TParseVersions::checkExtensionsRequested(const TSourceLoc& loc, int numExte
for (int i = 0; i < numExtensions; ++i) { for (int i = 0; i < numExtensions; ++i) {
TExtensionBehavior behavior = getExtensionBehavior(extensions[i]); TExtensionBehavior behavior = getExtensionBehavior(extensions[i]);
if (behavior == EBhDisable && relaxedErrors()) { if (behavior == EBhDisable && relaxedErrors()) {
infoSink.info.message(EPrefixWarning, "The following extension must be enabled to use this feature:", loc); infoSink.info.append("WARNING: ");
infoSink.info.location(loc);
infoSink.info.append("The following extension must be enabled to use this feature:");
infoSink.info.append("\n");
behavior = EBhWarn; behavior = EBhWarn;
} }
if (behavior == EBhWarn) { if (behavior == EBhWarn) {
infoSink.info.message(EPrefixWarning, ("extension " + TString(extensions[i]) + " is being used for " + featureDesc).c_str(), loc); infoSink.info.append("WARNING: ");
infoSink.info.location(loc);
infoSink.info.append(("extension " + TString(extensions[i]) + " is being used for " + featureDesc).c_str());
infoSink.info.append("\n");
warned = true; warned = true;
} }
} }

View File

@ -1251,7 +1251,10 @@ static void OutputConstantUnion(TInfoSink& out, const TIntermTyped* node, const
} }
break; break;
default: default:
out.info.message(EPrefixInternalError, "Unknown constant", node->getLoc()); out.info.append("INTERNAL ERROR: ");
out.info.location(node->getLoc());
out.info.append("Unknown constant");
out.info.append("\n");
break; break;
} }
} }

View File

@ -55,7 +55,7 @@ namespace glslang {
// //
void TIntermediate::error(TInfoSink& infoSink, const char* message) void TIntermediate::error(TInfoSink& infoSink, const char* message)
{ {
infoSink.info.prefix(EPrefixError); infoSink.info.append("ERROR: ");
infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n"; infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
++numErrors; ++numErrors;
@ -64,7 +64,7 @@ void TIntermediate::error(TInfoSink& infoSink, const char* message)
// Link-time warning. // Link-time warning.
void TIntermediate::warn(TInfoSink& infoSink, const char* message) void TIntermediate::warn(TInfoSink& infoSink, const char* message)
{ {
infoSink.info.prefix(EPrefixWarning); infoSink.info.append("WARNING: ");
infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n"; infoSink.info << "Linking " << StageName(language) << " stage: " << message << "\n";
} }
@ -435,7 +435,7 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
// compile-time or link-time error to have different values specified for the stride for the same buffer." // compile-time or link-time error to have different values specified for the stride for the same buffer."
if (xfbBuffers[b].stride != TQualifier::layoutXfbStrideEnd && xfbBuffers[b].implicitStride > xfbBuffers[b].stride) { if (xfbBuffers[b].stride != TQualifier::layoutXfbStrideEnd && xfbBuffers[b].implicitStride > xfbBuffers[b].stride) {
error(infoSink, "xfb_stride is too small to hold all buffer entries:"); error(infoSink, "xfb_stride is too small to hold all buffer entries:");
infoSink.info.prefix(EPrefixError); infoSink.info.append("ERROR: ");
infoSink.info << " xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << ", minimum stride needed: " << xfbBuffers[b].implicitStride << "\n"; infoSink.info << " xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << ", minimum stride needed: " << xfbBuffers[b].implicitStride << "\n";
} }
if (xfbBuffers[b].stride == TQualifier::layoutXfbStrideEnd) if (xfbBuffers[b].stride == TQualifier::layoutXfbStrideEnd)
@ -446,11 +446,11 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
// multiple of 4, or a compile-time or link-time error results." // multiple of 4, or a compile-time or link-time error results."
if (xfbBuffers[b].containsDouble && ! IsMultipleOfPow2(xfbBuffers[b].stride, 8)) { if (xfbBuffers[b].containsDouble && ! IsMultipleOfPow2(xfbBuffers[b].stride, 8)) {
error(infoSink, "xfb_stride must be multiple of 8 for buffer holding a double:"); error(infoSink, "xfb_stride must be multiple of 8 for buffer holding a double:");
infoSink.info.prefix(EPrefixError); infoSink.info.append("ERROR: ");
infoSink.info << " xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n"; infoSink.info << " xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n";
} else if (! IsMultipleOfPow2(xfbBuffers[b].stride, 4)) { } else if (! IsMultipleOfPow2(xfbBuffers[b].stride, 4)) {
error(infoSink, "xfb_stride must be multiple of 4:"); error(infoSink, "xfb_stride must be multiple of 4:");
infoSink.info.prefix(EPrefixError); infoSink.info.append("ERROR: ");
infoSink.info << " xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n"; infoSink.info << " xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n";
} }
@ -458,7 +458,7 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
// implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents." // implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents."
if (xfbBuffers[b].stride > (unsigned int)(4 * resources.maxTransformFeedbackInterleavedComponents)) { if (xfbBuffers[b].stride > (unsigned int)(4 * resources.maxTransformFeedbackInterleavedComponents)) {
error(infoSink, "xfb_stride is too large:"); error(infoSink, "xfb_stride is too large:");
infoSink.info.prefix(EPrefixError); infoSink.info.append("ERROR: ");
infoSink.info << " xfb_buffer " << (unsigned int)b << ", components (1/4 stride) needed are " << xfbBuffers[b].stride/4 << ", gl_MaxTransformFeedbackInterleavedComponents is " << resources.maxTransformFeedbackInterleavedComponents << "\n"; infoSink.info << " xfb_buffer " << (unsigned int)b << ", components (1/4 stride) needed are " << xfbBuffers[b].stride/4 << ", gl_MaxTransformFeedbackInterleavedComponents is " << resources.maxTransformFeedbackInterleavedComponents << "\n";
} }
} }

View File

@ -855,7 +855,10 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier()
return keyword; return keyword;
default: default:
_parseContext.infoSink.info.message(EPrefixInternalError, "Unknown glslang keyword", loc); _parseContext.infoSink.info.append("INTERNAL ERROR: ");
_parseContext.infoSink.info.location(loc);
_parseContext.infoSink.info.append("Unknown glslang keyword");
_parseContext.infoSink.info.append("\n");
return EHTokNone; return EHTokNone;
} }
} }