Bug Summary

File:root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp
Warning:line 77, column 9
Value stored to 'uniqueId' during its initialization is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Symbol.cpp -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse2 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/gfx/angle/targets/translator -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/gfx/angle/targets/translator -resource-dir /usr/lib/llvm-21/lib/clang/21 -include /root/firefox-clang/config/gcc_hidden.h -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/stl_wrappers -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D _GLIBCXX_ASSERTIONS -D DEBUG=1 -D ANGLE_PLATFORM_EXPORT= -D __NDK_FPABI__= -D ANGLE_SKIP_DXGI_1_2_CHECK -D ANGLE_ENABLE_KEYEDMUTEX -D ANGLE_TRANSLATOR_ESSL_ONLY -D ANGLE_DISABLE_POOL_ALLOC -D ANGLE_ENABLE_APPLE_WORKAROUNDS -D ANGLE_ENABLE_ESSL -D ANGLE_ENABLE_GLSL -D ANGLE_ENABLE_HLSL -D ANGLE_ENABLE_SHARE_CONTEXT_LOCK=1 -D ANGLE_VMA_VERSION=2003000 -D CR_CLANG_REVISION="llvmorg-16-init-6578-g0d30e92f-2" -D DYNAMIC_ANNOTATIONS_ENABLED=0 -D NOMINMAX -D UNICODE -D WINVER=0x0A00 -D _ATL_NO_OPENGL -D _CRT_NONSTDC_NO_WARNINGS -D _CRT_RAND_S -D _CRT_SECURE_NO_DEPRECATE -D _HAS_EXCEPTIONS=0 -D _SCL_SECURE_NO_DEPRECATE -D _SECURE_ATL -D _UNICODE -D _WINSOCK_DEPRECATED_NO_WARNINGS -I /root/firefox-clang/gfx/angle/targets/translator -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/gfx/angle/targets/translator -I /root/firefox-clang/gfx/angle/checkout/include -I /root/firefox-clang/gfx/angle/checkout/src -I /root/firefox-clang/gfx/angle/checkout/src/common/third_party/base -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nspr -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/nss -D MOZILLA_CLIENT -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/x86_64-linux-gnu/c++/14 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/backward -internal-isystem /usr/lib/llvm-21/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-error=pessimizing-move -Wno-error=large-by-value-copy=128 -Wno-error=implicit-int-float-conversion -Wno-error=thread-safety-analysis -Wno-error=tautological-type-limit-compare -Wno-invalid-offsetof -Wno-range-loop-analysis -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conversion -Wno-deprecated-this-capture -Wno-inline-new-delete -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-vla-cxx-extension -Wno-unknown-warning-option -Wno-final-dtor-non-final-class -Wno-implicit-const-int-float-conversion -Wno-range-loop-construct -fdeprecated-macro -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fno-rtti -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fno-sized-deallocation -fno-aligned-allocation -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2025-06-27-100320-3286336-1 -x c++ /root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp
1//
2// Copyright 2017 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// Symbol.cpp: Symbols representing variables, functions, structures and interface blocks.
7//
8
9#if defined(_MSC_VER)
10# pragma warning(disable : 4718)
11#endif
12
13#include "compiler/translator/Symbol.h"
14
15#include "compiler/translator/ImmutableStringBuilder.h"
16#include "compiler/translator/SymbolTable.h"
17
18namespace sh
19{
20
21namespace
22{
23
24constexpr const ImmutableString kMainName("main");
25constexpr const ImmutableString kImageLoadName("imageLoad");
26constexpr const ImmutableString kImageStoreName("imageStore");
27constexpr const ImmutableString kImageSizeName("imageSize");
28constexpr const ImmutableString kImageAtomicExchangeName("imageAtomicExchange");
29constexpr const ImmutableString kAtomicCounterName("atomicCounter");
30
31static const char kFunctionMangledNameSeparator = '(';
32
33} // anonymous namespace
34
35TSymbol::TSymbol(TSymbolTable *symbolTable,
36 const ImmutableString &name,
37 SymbolType symbolType,
38 SymbolClass symbolClass,
39 TExtension extension)
40 : mName(name),
41 mUniqueId(symbolTable->nextUniqueId()),
42 mExtensions(
43 std::array<TExtension, 3u>{{extension, TExtension::UNDEFINED, TExtension::UNDEFINED}}),
44 mSymbolType(symbolType),
45 mSymbolClass(symbolClass)
46{
47 ASSERT(mSymbolType == SymbolType::BuiltIn || extension == TExtension::UNDEFINED)(mSymbolType == SymbolType::BuiltIn || extension == TExtension
::UNDEFINED ? static_cast<void>(0) : (!((::gl::priv::ShouldCreatePlatformLogMessage
(::gl::LOG_FATAL))) ? static_cast<void>(0) : ::gl::priv
::LogMessageVoidify() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 47, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 47 << "): " << "mSymbolType == SymbolType::BuiltIn || extension == TExtension::UNDEFINED"
))
;
48 ASSERT(mName != "" || mSymbolType == SymbolType::AngleInternal ||(mName != "" || mSymbolType == SymbolType::AngleInternal || mSymbolType
== SymbolType::Empty ? static_cast<void>(0) : (!((::gl
::priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 49, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 49 << "): " << "mName != \"\" || mSymbolType == SymbolType::AngleInternal || mSymbolType == SymbolType::Empty"
))
49 mSymbolType == SymbolType::Empty)(mName != "" || mSymbolType == SymbolType::AngleInternal || mSymbolType
== SymbolType::Empty ? static_cast<void>(0) : (!((::gl
::priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 49, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 49 << "): " << "mName != \"\" || mSymbolType == SymbolType::AngleInternal || mSymbolType == SymbolType::Empty"
))
;
50}
51
52TSymbol::TSymbol(TSymbolTable *symbolTable,
53 const ImmutableString &name,
54 SymbolType symbolType,
55 SymbolClass symbolClass,
56 const std::array<TExtension, 3u> &extensions)
57 : mName(name),
58 mUniqueId(symbolTable->nextUniqueId()),
59 mExtensions(extensions),
60 mSymbolType(symbolType),
61 mSymbolClass(symbolClass)
62{
63 ASSERT(mSymbolType == SymbolType::BuiltIn || extensions[0] == TExtension::UNDEFINED)(mSymbolType == SymbolType::BuiltIn || extensions[0] == TExtension
::UNDEFINED ? static_cast<void>(0) : (!((::gl::priv::ShouldCreatePlatformLogMessage
(::gl::LOG_FATAL))) ? static_cast<void>(0) : ::gl::priv
::LogMessageVoidify() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 63, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 63 << "): " << "mSymbolType == SymbolType::BuiltIn || extensions[0] == TExtension::UNDEFINED"
))
;
64 ASSERT(mName != "" || mSymbolType == SymbolType::AngleInternal ||(mName != "" || mSymbolType == SymbolType::AngleInternal || mSymbolType
== SymbolType::Empty ? static_cast<void>(0) : (!((::gl
::priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 65, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 65 << "): " << "mName != \"\" || mSymbolType == SymbolType::AngleInternal || mSymbolType == SymbolType::Empty"
))
65 mSymbolType == SymbolType::Empty)(mName != "" || mSymbolType == SymbolType::AngleInternal || mSymbolType
== SymbolType::Empty ? static_cast<void>(0) : (!((::gl
::priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 65, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 65 << "): " << "mName != \"\" || mSymbolType == SymbolType::AngleInternal || mSymbolType == SymbolType::Empty"
))
;
66}
67
68ImmutableString TSymbol::name() const
69{
70 if (!mName.empty())
71 {
72 return mName;
73 }
74 // This can be called for nameless function parameters in HLSL.
75 ASSERT(mSymbolType == SymbolType::AngleInternal ||(mSymbolType == SymbolType::AngleInternal || (mSymbolType == SymbolType
::Empty && isVariable()) ? static_cast<void>(0)
: (!((::gl::priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL
))) ? static_cast<void>(0) : ::gl::priv::LogMessageVoidify
() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 76, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 76 << "): " << "mSymbolType == SymbolType::AngleInternal || (mSymbolType == SymbolType::Empty && isVariable())"
))
76 (mSymbolType == SymbolType::Empty && isVariable()))(mSymbolType == SymbolType::AngleInternal || (mSymbolType == SymbolType
::Empty && isVariable()) ? static_cast<void>(0)
: (!((::gl::priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL
))) ? static_cast<void>(0) : ::gl::priv::LogMessageVoidify
() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 76, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 76 << "): " << "mSymbolType == SymbolType::AngleInternal || (mSymbolType == SymbolType::Empty && isVariable())"
))
;
77 int uniqueId = mUniqueId.get();
Value stored to 'uniqueId' during its initialization is never read
78 ImmutableStringBuilder symbolNameOut(sizeof(uniqueId) * 2u + 1u);
79 symbolNameOut << 's';
80 symbolNameOut.appendHex(mUniqueId.get());
81 return symbolNameOut;
82}
83
84ImmutableString TSymbol::getMangledName() const
85{
86 if (mSymbolClass == SymbolClass::Function)
87 {
88 // We do this instead of using proper virtual functions so that we can better support
89 // constexpr symbols.
90 return static_cast<const TFunction *>(this)->getFunctionMangledName();
91 }
92 ASSERT(mSymbolType != SymbolType::Empty)(mSymbolType != SymbolType::Empty ? static_cast<void>(0
) : (!((::gl::priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL
))) ? static_cast<void>(0) : ::gl::priv::LogMessageVoidify
() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 92, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 92 << "): " << "mSymbolType != SymbolType::Empty"
))
;
93 return name();
94}
95
96TVariable::TVariable(TSymbolTable *symbolTable,
97 const ImmutableString &name,
98 const TType *type,
99 SymbolType symbolType,
100 TExtension extension)
101 : TSymbol(symbolTable, name, symbolType, SymbolClass::Variable, extension),
102 mType(type),
103 unionArray(nullptr)
104{
105 ASSERT(mType)(mType ? static_cast<void>(0) : (!((::gl::priv::ShouldCreatePlatformLogMessage
(::gl::LOG_FATAL))) ? static_cast<void>(0) : ::gl::priv
::LogMessageVoidify() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 105, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 105 << "): " << "mType"))
;
106 ASSERT(name.empty() || symbolType != SymbolType::Empty)(name.empty() || symbolType != SymbolType::Empty ? static_cast
<void>(0) : (!((::gl::priv::ShouldCreatePlatformLogMessage
(::gl::LOG_FATAL))) ? static_cast<void>(0) : ::gl::priv
::LogMessageVoidify() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 106, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 106 << "): " << "name.empty() || symbolType != SymbolType::Empty"
))
;
107}
108
109TVariable::TVariable(TSymbolTable *symbolTable,
110 const ImmutableString &name,
111 const TType *type,
112 SymbolType symbolType,
113 const std::array<TExtension, 3u> &extensions)
114 : TSymbol(symbolTable, name, symbolType, SymbolClass::Variable, extensions),
115 mType(type),
116 unionArray(nullptr)
117{
118 ASSERT(mType)(mType ? static_cast<void>(0) : (!((::gl::priv::ShouldCreatePlatformLogMessage
(::gl::LOG_FATAL))) ? static_cast<void>(0) : ::gl::priv
::LogMessageVoidify() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 118, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 118 << "): " << "mType"))
;
119 ASSERT(name.empty() || symbolType != SymbolType::Empty)(name.empty() || symbolType != SymbolType::Empty ? static_cast
<void>(0) : (!((::gl::priv::ShouldCreatePlatformLogMessage
(::gl::LOG_FATAL))) ? static_cast<void>(0) : ::gl::priv
::LogMessageVoidify() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 119, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 119 << "): " << "name.empty() || symbolType != SymbolType::Empty"
))
;
120}
121
122TStructure::TStructure(TSymbolTable *symbolTable,
123 const ImmutableString &name,
124 const TFieldList *fields,
125 SymbolType symbolType)
126 : TSymbol(symbolTable, name, symbolType, SymbolClass::Struct), TFieldListCollection(fields)
127{}
128
129void TStructure::createSamplerSymbols(const char *namePrefix,
130 const TString &apiNamePrefix,
131 TVector<const TVariable *> *outputSymbols,
132 TMap<const TVariable *, TString> *outputSymbolsToAPINames,
133 TSymbolTable *symbolTable) const
134{
135 ASSERT(containsSamplers())(containsSamplers() ? static_cast<void>(0) : (!((::gl::
priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 135, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 135 << "): " << "containsSamplers()"
))
;
136 for (const auto *field : *mFields)
137 {
138 const TType *fieldType = field->type();
139 if (IsSampler(fieldType->getBasicType()) || fieldType->isStructureContainingSamplers())
140 {
141 std::stringstream fieldName = sh::InitializeStream<std::stringstream>();
142 fieldName << namePrefix << "_" << field->name();
143 TString fieldApiName = apiNamePrefix + ".";
144 fieldApiName += field->name().data();
145 fieldType->createSamplerSymbols(ImmutableString(fieldName.str()), fieldApiName,
146 outputSymbols, outputSymbolsToAPINames, symbolTable);
147 }
148 }
149}
150
151void TStructure::setName(const ImmutableString &name)
152{
153 ImmutableString *mutableName = const_cast<ImmutableString *>(&mName);
154 *mutableName = name;
155}
156
157TInterfaceBlock::TInterfaceBlock(TSymbolTable *symbolTable,
158 const ImmutableString &name,
159 const TFieldList *fields,
160 const TLayoutQualifier &layoutQualifier,
161 SymbolType symbolType,
162 TExtension extension)
163 : TSymbol(symbolTable, name, symbolType, SymbolClass::InterfaceBlock, extension),
164 TFieldListCollection(fields),
165 mBlockStorage(layoutQualifier.blockStorage),
166 mBinding(layoutQualifier.binding)
167{
168 ASSERT(name != nullptr)(name != nullptr ? static_cast<void>(0) : (!((::gl::priv
::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 168, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 168 << "): " << "name != nullptr"
))
;
169}
170
171TInterfaceBlock::TInterfaceBlock(TSymbolTable *symbolTable,
172 const ImmutableString &name,
173 const TFieldList *fields,
174 const TLayoutQualifier &layoutQualifier,
175 SymbolType symbolType,
176 const std::array<TExtension, 3u> &extensions)
177 : TSymbol(symbolTable, name, symbolType, SymbolClass::InterfaceBlock, extensions),
178 TFieldListCollection(fields),
179 mBlockStorage(layoutQualifier.blockStorage),
180 mBinding(layoutQualifier.binding)
181{
182 ASSERT(name != nullptr)(name != nullptr ? static_cast<void>(0) : (!((::gl::priv
::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 182, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 182 << "): " << "name != nullptr"
))
;
183}
184
185TFunction::TFunction(TSymbolTable *symbolTable,
186 const ImmutableString &name,
187 SymbolType symbolType,
188 const TType *retType,
189 bool knownToNotHaveSideEffects)
190 : TSymbol(symbolTable, name, symbolType, SymbolClass::Function, TExtension::UNDEFINED),
191 mParametersVector(new TParamVector()),
192 mParameters(nullptr),
193 returnType(retType),
194 mMangledName(""),
195 mParamCount(0u),
196 mOp(EOpNull),
197 defined(false),
198 mHasPrototypeDeclaration(false),
199 mKnownToNotHaveSideEffects(knownToNotHaveSideEffects),
200 mHasVoidParameter(false)
201{
202 // Functions with an empty name are not allowed.
203 ASSERT(symbolType != SymbolType::Empty)(symbolType != SymbolType::Empty ? static_cast<void>(0)
: (!((::gl::priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL
))) ? static_cast<void>(0) : ::gl::priv::LogMessageVoidify
() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 203, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 203 << "): " << "symbolType != SymbolType::Empty"
))
;
204 ASSERT(name != nullptr || symbolType == SymbolType::AngleInternal)(name != nullptr || symbolType == SymbolType::AngleInternal ?
static_cast<void>(0) : (!((::gl::priv::ShouldCreatePlatformLogMessage
(::gl::LOG_FATAL))) ? static_cast<void>(0) : ::gl::priv
::LogMessageVoidify() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 204, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 204 << "): " << "name != nullptr || symbolType == SymbolType::AngleInternal"
))
;
205}
206
207void TFunction::addParameter(const TVariable *p)
208{
209 ASSERT(mParametersVector)(mParametersVector ? static_cast<void>(0) : (!((::gl::priv
::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 209, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 209 << "): " << "mParametersVector"
))
;
210 mParametersVector->push_back(p);
211 mParameters = mParametersVector->data();
212 mParamCount = mParametersVector->size();
213 mMangledName = kEmptyImmutableString;
214}
215
216void TFunction::shareParameters(const TFunction &parametersSource)
217{
218 mParametersVector = nullptr;
219 mParameters = parametersSource.mParameters;
220 mParamCount = parametersSource.mParamCount;
221 ASSERT(parametersSource.name() == name())(parametersSource.name() == name() ? static_cast<void>(
0) : (!((::gl::priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL
))) ? static_cast<void>(0) : ::gl::priv::LogMessageVoidify
() & (::gl::LogMessage("/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 221, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "/root/firefox-clang/gfx/angle/checkout/src/compiler/translator/Symbol.cpp"
<< ":" << 221 << "): " << "parametersSource.name() == name()"
))
;
222 mMangledName = parametersSource.mMangledName;
223}
224
225ImmutableString TFunction::buildMangledName() const
226{
227 ImmutableString name = this->name();
228 std::string newName(name.data(), name.length());
229 newName += kFunctionMangledNameSeparator;
230
231 for (size_t i = 0u; i < mParamCount; ++i)
232 {
233 newName += mParameters[i]->getType().getMangledName();
234 }
235 return ImmutableString(newName);
236}
237
238bool TFunction::isMain() const
239{
240 return symbolType() == SymbolType::UserDefined && name() == kMainName;
241}
242
243bool TFunction::isImageFunction() const
244{
245 return symbolType() == SymbolType::BuiltIn &&
246 (name() == kImageSizeName || name() == kImageLoadName || name() == kImageStoreName ||
247 name() == kImageAtomicExchangeName);
248}
249
250bool TFunction::isAtomicCounterFunction() const
251{
252 return SymbolType() == SymbolType::BuiltIn && name().beginsWith(kAtomicCounterName);
253}
254} // namespace sh