Bug Summary

File:root/firefox-clang/obj-x86_64-pc-linux-gnu/third_party/angle/translator_gn/./../../../../third_party/angle/src/compiler/translator/Symbol.cpp
Warning:line 76, 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 -O2 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Unified_cpp_angle_translator_gn1.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 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/third_party/angle/translator_gn -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/third_party/angle/translator_gn -resource-dir /usr/lib/llvm-23/lib/clang/23 -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 -D _GLIBCXX_ASSERTIONS=1 -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D DEBUG=1 -D ANGLE_DISABLE_POOL_ALLOC -D ANGLE_ENABLE_CONTEXT_MUTEX=1 -U ANGLE_ENABLE_DEBUG_ANNOTATIONS -D ANGLE_ENABLE_ESSL -D ANGLE_ENABLE_GLSL -D ANGLE_ENABLE_KEYEDMUTEX -D ANGLE_ENABLE_SHARE_CONTEXT_LOCK=1 -D ANGLE_PLATFORM_EXPORT= -D ANGLE_SKIP_DXGI_1_2_CHECK -D ANGLE_DEBUG_LAYERS_ENABLED -D DYNAMIC_ANNOTATIONS_ENABLED=1 -D ANGLE_IS_LINUX -D ANGLE_USE_VULKAN_DISPLAY -D ANGLE_VULKAN_DISPLAY_MODE_HEADLESS -D USE_AURA=1 -D USE_GLIB=1 -D USE_OZONE=1 -D USE_UDEV -D _FILE_OFFSET_BITS=64 -D _LARGEFILE64_SOURCE -D _LARGEFILE_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D _DEBUG -D ANGLE_USE_X11 -D _GNU_SOURCE -I /root/firefox-clang/third_party/angle/translator_gn -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/third_party/angle/translator_gn -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/ipc/ipdl/_ipdlheaders -I /root/firefox-clang/ipc/chromium/src -I /root/firefox-clang/third_party/angle/include -I /root/firefox-clang/third_party/angle/src -I /root/firefox-clang/third_party/angle/src/common/base -I /root/firefox-clang/third_party/angle/src/common/third_party/xxhash -I /root/firefox-clang/tools/profiler/public -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -D MOZILLA_CLIENT -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/c++/16 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/x86_64-linux-gnu/c++/16 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/c++/16/backward -internal-isystem /usr/lib/llvm-23/lib/clang/23/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -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-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-character-conversion -std=gnu++20 -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 -fno-implicit-modules -fskip-odr-check-in-gmf -fno-sized-deallocation -fno-aligned-allocation -fdiagnostics-absolute-paths -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -mllvm -dwarf-linkage-names=Abstract -faddrsig -fdwarf2-cfi-asm -o /tmp/scan-build-2026-09-01-224014-2642839-1 -x c++ Unified_cpp_angle_translator_gn1.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#include "common/unsafe_buffers.h"
15
16#include "compiler/translator/ImmutableStringBuilder.h"
17#include "compiler/translator/SymbolTable.h"
18
19namespace sh
20{
21
22namespace
23{
24
25constexpr const ImmutableString kMainName("main");
26constexpr const ImmutableString kImageLoadName("imageLoad");
27constexpr const ImmutableString kImageStoreName("imageStore");
28constexpr const ImmutableString kImageSizeName("imageSize");
29constexpr const ImmutableString kImageAtomicExchangeName("imageAtomicExchange");
30constexpr const ImmutableString kAtomicCounterName("atomicCounter");
31
32} // anonymous namespace
33
34TSymbol::TSymbol(TSymbolTable *symbolTable,
35 const ImmutableString &name,
36 SymbolType symbolType,
37 SymbolClass symbolClass,
38 TExtension extension)
39 : mName(name),
40 mUniqueId(symbolTable->nextUniqueId()),
41 mExtensions(
42 std::array<TExtension, 3u>{{extension, TExtension::UNDEFINED, TExtension::UNDEFINED}}),
43 mSymbolType(symbolType),
44 mSymbolClass(symbolClass)
45{
46 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 46, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 46 << "): " << "mSymbolType == SymbolType::BuiltIn || extension == TExtension::UNDEFINED"
))
;
47 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 48, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 48 << "): " << "mName != \"\" || mSymbolType == SymbolType::AngleInternal || mSymbolType == SymbolType::Empty"
))
48 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 48, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 48 << "): " << "mName != \"\" || mSymbolType == SymbolType::AngleInternal || mSymbolType == SymbolType::Empty"
))
;
49}
50
51TSymbol::TSymbol(TSymbolTable *symbolTable,
52 const ImmutableString &name,
53 SymbolType symbolType,
54 SymbolClass symbolClass,
55 const std::array<TExtension, 3u> &extensions)
56 : mName(name),
57 mUniqueId(symbolTable->nextUniqueId()),
58 mExtensions(extensions),
59 mSymbolType(symbolType),
60 mSymbolClass(symbolClass)
61{
62 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 62, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 62 << "): " << "mSymbolType == SymbolType::BuiltIn || extensions[0] == TExtension::UNDEFINED"
))
;
63 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 64, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 64 << "): " << "mName != \"\" || mSymbolType == SymbolType::AngleInternal || mSymbolType == SymbolType::Empty"
))
64 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 64, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 64 << "): " << "mName != \"\" || mSymbolType == SymbolType::AngleInternal || mSymbolType == SymbolType::Empty"
))
;
65}
66
67ImmutableString TSymbol::name() const
68{
69 if (!mName.empty())
70 {
71 return mName;
72 }
73 // This can be called for nameless function parameters in HLSL.
74 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 75, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 75 << "): " << "mSymbolType == SymbolType::AngleInternal || (mSymbolType == SymbolType::Empty && isVariable())"
))
75 (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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 75, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 75 << "): " << "mSymbolType == SymbolType::AngleInternal || (mSymbolType == SymbolType::Empty && isVariable())"
))
;
76 int uniqueId = mUniqueId.get();
Value stored to 'uniqueId' during its initialization is never read
77 ImmutableStringBuilder symbolNameOut(sizeof(uniqueId) * 2u + 1u);
78 symbolNameOut << 's';
79 symbolNameOut.appendHex(mUniqueId.get());
80 return symbolNameOut;
81}
82
83ImmutableString TSymbol::getMangledName() const
84{
85 if (mSymbolClass == SymbolClass::Function)
86 {
87 // We do this instead of using proper virtual functions so that we can better support
88 // constexpr symbols.
89 return static_cast<const TFunction *>(this)->getFunctionMangledName();
90 }
91 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 91, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 91 << "): " << "mSymbolType != SymbolType::Empty"
))
;
92 return name();
93}
94
95TVariable::TVariable(TSymbolTable *symbolTable,
96 const ImmutableString &name,
97 const TType *type,
98 SymbolType symbolType,
99 TExtension extension)
100 : TSymbol(symbolTable, name, symbolType, SymbolClass::Variable, extension),
101 mType(type),
102 unionArray(nullptr)
103{
104 ASSERT(mType)(mType ? static_cast<void>(0) : (!((::gl::priv::ShouldCreatePlatformLogMessage
(::gl::LOG_FATAL))) ? static_cast<void>(0) : ::gl::priv
::LogMessageVoidify() & (::gl::LogMessage("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 104, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 104 << "): " << "mType"))
;
105 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 105, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 105 << "): " << "name.empty() || symbolType != SymbolType::Empty"
))
;
106}
107
108TVariable::TVariable(TSymbolTable *symbolTable,
109 const ImmutableString &name,
110 const TType *type,
111 SymbolType symbolType,
112 const std::array<TExtension, 3u> &extensions)
113 : TSymbol(symbolTable, name, symbolType, SymbolClass::Variable, extensions),
114 mType(type),
115 unionArray(nullptr)
116{
117 ASSERT(mType)(mType ? static_cast<void>(0) : (!((::gl::priv::ShouldCreatePlatformLogMessage
(::gl::LOG_FATAL))) ? static_cast<void>(0) : ::gl::priv
::LogMessageVoidify() & (::gl::LogMessage("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 117, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 117 << "): " << "mType"))
;
118 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 118, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 118 << "): " << "name.empty() || symbolType != SymbolType::Empty"
))
;
119}
120
121TStructure::TStructure(TSymbolTable *symbolTable,
122 const ImmutableString &name,
123 const TFieldList *fields,
124 SymbolType symbolType)
125 : TSymbol(symbolTable, name, symbolType, SymbolClass::Struct),
126 TFieldListCollection(fields),
127 mAtGlobalScope(false),
128 mImplementingInterfaceBlock(false)
129{}
130
131void TStructure::createSamplerSymbols(const char *namePrefix,
132 const TString &apiNamePrefix,
133 TVector<const TVariable *> *outputSymbols,
134 TMap<const TVariable *, TString> *outputSymbolsToAPINames,
135 TSymbolTable *symbolTable) const
136{
137 ASSERT(containsSamplers())(containsSamplers() ? static_cast<void>(0) : (!((::gl::
priv::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 137, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 137 << "): " << "containsSamplers()"
))
;
138 for (const auto *field : *mFields)
139 {
140 const TType *fieldType = field->type();
141 if (IsSampler(fieldType->getBasicType()) || fieldType->isStructureContainingSamplers())
142 {
143 std::stringstream fieldName = sh::InitializeStream<std::stringstream>();
144 fieldName << namePrefix << "_" << field->name();
145 TString fieldApiName = apiNamePrefix + ".";
146 fieldApiName += field->name().data();
147 fieldType->createSamplerSymbols(ImmutableString(fieldName.str()), fieldApiName,
148 outputSymbols, outputSymbolsToAPINames, symbolTable);
149 }
150 }
151}
152
153void TStructure::setName(const ImmutableString &name)
154{
155 ImmutableString *mutableName = const_cast<ImmutableString *>(&mName);
156 *mutableName = name;
157}
158
159TInterfaceBlock::TInterfaceBlock(TSymbolTable *symbolTable,
160 const ImmutableString &name,
161 const TFieldList *fields,
162 const TLayoutQualifier &layoutQualifier,
163 SymbolType symbolType,
164 TExtension extension)
165 : TSymbol(symbolTable, name, symbolType, SymbolClass::InterfaceBlock, extension),
166 TFieldListCollection(fields),
167 mBlockStorage(layoutQualifier.blockStorage),
168 mBinding(layoutQualifier.binding),
169 mIsDefaultUniformBlock(false)
170{
171 ASSERT(name != nullptr)(name != nullptr ? static_cast<void>(0) : (!((::gl::priv
::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 171, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 171 << "): " << "name != nullptr"
))
;
172}
173
174TInterfaceBlock::TInterfaceBlock(TSymbolTable *symbolTable,
175 const ImmutableString &name,
176 const TFieldList *fields,
177 const TLayoutQualifier &layoutQualifier,
178 SymbolType symbolType,
179 const std::array<TExtension, 3u> &extensions)
180 : TSymbol(symbolTable, name, symbolType, SymbolClass::InterfaceBlock, extensions),
181 TFieldListCollection(fields),
182 mBlockStorage(layoutQualifier.blockStorage),
183 mBinding(layoutQualifier.binding),
184 mIsDefaultUniformBlock(false)
185{
186 ASSERT(name != nullptr)(name != nullptr ? static_cast<void>(0) : (!((::gl::priv
::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 186, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 186 << "): " << "name != nullptr"
))
;
187}
188
189TFunction::TFunction(TSymbolTable *symbolTable,
190 const ImmutableString &name,
191 SymbolType symbolType,
192 const TType *retType,
193 bool knownToNotHaveSideEffects)
194 : TSymbol(symbolTable, name, symbolType, SymbolClass::Function, TExtension::UNDEFINED),
195 mParametersVector(new TParamVector()),
196 mParameters(nullptr),
197 returnType(retType),
198 mMangledName(""),
199 mParamCount(0u),
200 mOp(EOpNull),
201 defined(false),
202 mHasPrototypeDeclaration(false),
203 mKnownToNotHaveSideEffects(knownToNotHaveSideEffects),
204 mHasVoidParameter(false)
205{
206 // Functions with an empty name are not allowed.
207 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 207, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 207 << "): " << "symbolType != SymbolType::Empty"
))
;
208 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 208, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 208 << "): " << "name != nullptr || symbolType == SymbolType::AngleInternal"
))
;
209}
210
211void TFunction::addParameter(const TVariable *p)
212{
213 ASSERT(mParametersVector)(mParametersVector ? static_cast<void>(0) : (!((::gl::priv
::ShouldCreatePlatformLogMessage(::gl::LOG_FATAL))) ? static_cast
<void>(0) : ::gl::priv::LogMessageVoidify() & (::gl
::LogMessage("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 213, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 213 << "): " << "mParametersVector"
))
;
214 mParametersVector->push_back(p);
215 mParameters = mParametersVector->data();
216 mParamCount = mParametersVector->size();
217 mMangledName = kEmptyImmutableString;
218}
219
220void TFunction::shareParameters(const TFunction &parametersSource)
221{
222 mParametersVector = nullptr;
223 mParameters = parametersSource.mParameters;
224 mParamCount = parametersSource.mParamCount;
225 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("./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
, __FUNCTION__, 225, ::gl::LOG_FATAL).stream()) << "\t! Assert failed in "
<< __FUNCTION__ << " (" << "./../../../../third_party/angle/src/compiler/translator/Symbol.cpp"
<< ":" << 225 << "): " << "parametersSource.name() == name()"
))
;
226 mMangledName = parametersSource.mMangledName;
227}
228
229ImmutableString TFunction::buildMangledName() const
230{
231 constexpr char kFunctionMangledNameSeparator = '(';
232
233 ImmutableString name = this->name();
234 std::string newName(name.data(), name.length());
235 newName += kFunctionMangledNameSeparator;
236
237 for (size_t i = 0u; i < mParamCount; ++i)
238 {
239 newName += ANGLE_UNSAFE_TODO(mParameters[i])mParameters[i]->getType().getMangledName();
240 }
241 return ImmutableString(newName);
242}
243
244bool TFunction::isMain() const
245{
246 return symbolType() == SymbolType::UserDefined && name() == kMainName;
247}
248
249bool TFunction::isImageFunction() const
250{
251 return symbolType() == SymbolType::BuiltIn &&
252 (name() == kImageSizeName || name() == kImageLoadName || name() == kImageStoreName ||
253 name() == kImageAtomicExchangeName);
254}
255
256bool TFunction::isAtomicCounterFunction() const
257{
258 return SymbolType() == SymbolType::BuiltIn && name().beginsWith(kAtomicCounterName);
259}
260} // namespace sh