blob: da9f5b4a5bcc6a7b0a90739f79df880d0ded8a76 [file] [log] [blame]
alokp@chromium.org07620a52010-09-23 17:53:56 +00001//
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +00002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
alokp@chromium.org07620a52010-09-23 17:53:56 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
zmo@google.com32e97312011-08-24 01:03:11 +00007#include "compiler/BuiltInFunctionEmulator.h"
zmo@google.comb1762df2011-07-30 02:04:23 +00008#include "compiler/DetectRecursion.h"
zmo@google.com0c6bb7a2011-08-17 19:39:58 +00009#include "compiler/ForLoopUnroll.h"
alokp@chromium.org07620a52010-09-23 17:53:56 +000010#include "compiler/Initialize.h"
alokp@chromium.org8b851c62012-06-15 16:25:11 +000011#include "compiler/InitializeParseContext.h"
zmo@google.comb9f64aa2012-01-20 00:35:15 +000012#include "compiler/MapLongVariableNames.h"
alokp@chromium.org07620a52010-09-23 17:53:56 +000013#include "compiler/ParseHelper.h"
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +000014#include "compiler/RenameFunction.h"
alokp@chromium.org07620a52010-09-23 17:53:56 +000015#include "compiler/ShHandle.h"
alokp@chromium.orgb59a7782010-11-24 18:38:33 +000016#include "compiler/ValidateLimitations.h"
gman@chromium.org8d804792012-10-17 21:33:48 +000017#include "compiler/VariablePacker.h"
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +000018#include "compiler/depgraph/DependencyGraph.h"
19#include "compiler/depgraph/DependencyGraphOutput.h"
20#include "compiler/timing/RestrictFragmentShaderTiming.h"
21#include "compiler/timing/RestrictVertexShaderTiming.h"
shannon.woods@transgaming.comda1ed362013-01-25 21:54:57 +000022#include "third_party/compiler/ArrayBoundsClamper.h"
alokp@chromium.org07620a52010-09-23 17:53:56 +000023
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +000024bool isWebGLBasedSpec(ShShaderSpec spec)
25{
26 return spec == SH_WEBGL_SPEC || spec == SH_CSS_SHADERS_SPEC;
27}
28
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000029namespace {
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +000030bool InitializeBuiltIns(const TBuiltInStrings &builtInStrings, TInfoSink &infoSink, TParseContext &parseContext)
31{
32 for (TBuiltInStrings::const_iterator i = builtInStrings.begin(); i != builtInStrings.end(); ++i)
33 {
34 const char* builtInShaders = i->c_str();
35 int builtInLengths = static_cast<int>(i->size());
36 if (builtInLengths <= 0)
37 continue;
38
39 if (PaParseStrings(1, &builtInShaders, &builtInLengths, &parseContext) != 0)
40 {
41 infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins");
42 return false;
43 }
44 }
45
46 return true;
47}
48
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000049bool InitializeSymbolTable(
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +000050 const TBuiltIns &builtIns,
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000051 ShShaderType type, ShShaderSpec spec, const ShBuiltInResources& resources,
52 TInfoSink& infoSink, TSymbolTable& symbolTable)
alokp@chromium.org07620a52010-09-23 17:53:56 +000053{
54 TIntermediate intermediate(infoSink);
55 TExtensionBehavior extBehavior;
zmo@google.com09c323a2011-08-12 18:22:25 +000056 InitExtensionBehavior(resources, extBehavior);
zmo@google.comdc4b4f82011-06-17 00:42:53 +000057 // The builtins deliberately don't specify precisions for the function
58 // arguments and return types. For that reason we don't try to check them.
59 TParseContext parseContext(symbolTable, extBehavior, intermediate, type, spec, 0, false, NULL, infoSink);
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +000060 parseContext.fragmentPrecisionHigh = resources.FragmentPrecisionHigh == 1;
alokp@chromium.org07620a52010-09-23 17:53:56 +000061
62 GlobalParseContext = &parseContext;
63
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +000064 assert(symbolTable.isEmpty());
65
alokp@chromium.org07620a52010-09-23 17:53:56 +000066 //
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +000067 // Parse the built-ins into the symbol table levels corresponding to each shader version (cf. ESymbolLevel).
alokp@chromium.org07620a52010-09-23 17:53:56 +000068 //
alokp@chromium.org07620a52010-09-23 17:53:56 +000069
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +000070 // Common built-ins
71 symbolTable.push();
72 if (!InitializeBuiltIns(builtIns.getCommonBuiltIns(), infoSink, parseContext))
73 return false;
shannonwoods@chromium.org6e10a0e2013-05-30 00:02:13 +000074
75 // GLSL ES 1.0 built-ins
76 symbolTable.push();
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +000077 if (!InitializeBuiltIns(builtIns.getEssl1BuiltIns(), infoSink, parseContext))
78 return false;
alokp@chromium.org07620a52010-09-23 17:53:56 +000079
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +000080 // GLSL ES 3.0 built-ins
81 symbolTable.push();
82 if (!InitializeBuiltIns(builtIns.getEssl3BuiltIns(), infoSink, parseContext))
83 return false;
shannonwoods@chromium.org6e10a0e2013-05-30 00:02:13 +000084
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000085 IdentifyBuiltIns(type, spec, resources, symbolTable);
alokp@chromium.org07620a52010-09-23 17:53:56 +000086
alokp@chromium.org07620a52010-09-23 17:53:56 +000087 return true;
88}
89
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000090class TScopedPoolAllocator {
91public:
92 TScopedPoolAllocator(TPoolAllocator* allocator, bool pushPop)
93 : mAllocator(allocator), mPushPopAllocator(pushPop) {
94 if (mPushPopAllocator) mAllocator->push();
95 SetGlobalPoolAllocator(mAllocator);
96 }
97 ~TScopedPoolAllocator() {
98 SetGlobalPoolAllocator(NULL);
99 if (mPushPopAllocator) mAllocator->pop();
100 }
101
102private:
103 TPoolAllocator* mAllocator;
104 bool mPushPopAllocator;
105};
106} // namespace
107
108TShHandleBase::TShHandleBase() {
109 allocator.push();
110 SetGlobalPoolAllocator(&allocator);
111}
112
113TShHandleBase::~TShHandleBase() {
114 SetGlobalPoolAllocator(NULL);
115 allocator.popAll();
116}
117
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000118TCompiler::TCompiler(ShShaderType type, ShShaderSpec spec)
119 : shaderType(type),
zmo@google.comf420c422011-09-12 18:27:59 +0000120 shaderSpec(spec),
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +0000121 fragmentPrecisionHigh(false),
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000122 clampingStrategy(SH_CLAMP_WITH_CLAMP_INTRINSIC),
zmo@google.com9996b8e2012-01-19 01:43:55 +0000123 builtInFunctionEmulator(type)
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000124{
zmo@google.comb9f64aa2012-01-20 00:35:15 +0000125 longNameMap = LongNameMap::GetInstance();
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000126}
127
128TCompiler::~TCompiler()
129{
zmo@google.comb9f64aa2012-01-20 00:35:15 +0000130 ASSERT(longNameMap);
131 longNameMap->Release();
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000132}
133
134bool TCompiler::Init(const ShBuiltInResources& resources)
alokp@chromium.org07620a52010-09-23 17:53:56 +0000135{
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000136 shaderVersion = 100;
gman@chromium.org8d804792012-10-17 21:33:48 +0000137 maxUniformVectors = (shaderType == SH_VERTEX_SHADER) ?
138 resources.MaxVertexUniformVectors :
139 resources.MaxFragmentUniformVectors;
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +0000140 TScopedPoolAllocator scopedAlloc(&allocator, false);
141
alokp@chromium.org07620a52010-09-23 17:53:56 +0000142 // Generate built-in symbol table.
143 if (!InitBuiltInSymbolTable(resources))
144 return false;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000145 InitExtensionBehavior(resources, extensionBehavior);
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +0000146 fragmentPrecisionHigh = resources.FragmentPrecisionHigh == 1;
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +0000147
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000148 arrayBoundsClamper.SetClampingStrategy(resources.ArrayIndexClampingStrategy);
149 clampingStrategy = resources.ArrayIndexClampingStrategy;
150
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000151 hashFunction = resources.HashFunction;
152
alokp@chromium.org07620a52010-09-23 17:53:56 +0000153 return true;
154}
155
156bool TCompiler::compile(const char* const shaderStrings[],
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000157 size_t numStrings,
alokp@chromium.org07620a52010-09-23 17:53:56 +0000158 int compileOptions)
159{
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +0000160 TScopedPoolAllocator scopedAlloc(&allocator, true);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000161 clearResults();
162
163 if (numStrings == 0)
164 return true;
165
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000166 // If compiling for WebGL, validate loop and indexing as well.
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +0000167 if (isWebGLBasedSpec(shaderSpec))
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000168 compileOptions |= SH_VALIDATE_LOOP_INDEXING;
alokp@chromium.org1f299542010-11-12 15:50:23 +0000169
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000170 // First string is path of source file if flag is set. The actual source follows.
171 const char* sourcePath = NULL;
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000172 size_t firstSource = 0;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000173 if (compileOptions & SH_SOURCE_PATH)
174 {
175 sourcePath = shaderStrings[0];
176 ++firstSource;
177 }
178
alokp@chromium.org07620a52010-09-23 17:53:56 +0000179 TIntermediate intermediate(infoSink);
180 TParseContext parseContext(symbolTable, extensionBehavior, intermediate,
zmo@google.comdc4b4f82011-06-17 00:42:53 +0000181 shaderType, shaderSpec, compileOptions, true,
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000182 sourcePath, infoSink);
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +0000183 parseContext.fragmentPrecisionHigh = fragmentPrecisionHigh;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000184 GlobalParseContext = &parseContext;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000185
186 // We preserve symbols at the built-in level from compile-to-compile.
187 // Start pushing the user-defined symbols at global level.
188 symbolTable.push();
189 if (!symbolTable.atGlobalLevel())
190 infoSink.info.message(EPrefixInternalError, "Wrong symbol table level");
191
192 // Parse shader.
193 bool success =
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000194 (PaParseStrings(numStrings - firstSource, &shaderStrings[firstSource], NULL, &parseContext) == 0) &&
alokp@chromium.org07620a52010-09-23 17:53:56 +0000195 (parseContext.treeRoot != NULL);
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000196
shannon.woods%transgaming.com@gtempaccount.com5524db02013-04-13 03:38:16 +0000197 shaderVersion = parseContext.getShaderVersion();
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000198
alokp@chromium.org07620a52010-09-23 17:53:56 +0000199 if (success) {
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000200 TIntermNode* root = parseContext.treeRoot;
201 success = intermediate.postProcess(root);
202
zmo@google.comb1762df2011-07-30 02:04:23 +0000203 if (success)
204 success = detectRecursion(root);
205
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000206 if (success && (compileOptions & SH_VALIDATE_LOOP_INDEXING))
207 success = validateLimitations(root);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000208
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000209 if (success && (compileOptions & SH_TIMING_RESTRICTIONS))
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000210 success = enforceTimingRestrictions(root, (compileOptions & SH_DEPENDENCY_GRAPH) != 0);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000211
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +0000212 if (success && shaderSpec == SH_CSS_SHADERS_SPEC)
213 rewriteCSSShader(root);
214
zmo@google.com0c6bb7a2011-08-17 19:39:58 +0000215 // Unroll for-loop markup needs to happen after validateLimitations pass.
216 if (success && (compileOptions & SH_UNROLL_FOR_LOOP_WITH_INTEGER_INDEX))
217 ForLoopUnroll::MarkForLoopsWithIntegerIndicesForUnrolling(root);
218
zmo@google.com32e97312011-08-24 01:03:11 +0000219 // Built-in function emulation needs to happen after validateLimitations pass.
220 if (success && (compileOptions & SH_EMULATE_BUILT_IN_FUNCTIONS))
221 builtInFunctionEmulator.MarkBuiltInFunctionsForEmulation(root);
222
daniel@transgaming.com4167cc92013-01-11 04:11:53 +0000223 // Clamping uniform array bounds needs to happen after validateLimitations pass.
224 if (success && (compileOptions & SH_CLAMP_INDIRECT_ARRAY_BOUNDS))
225 arrayBoundsClamper.MarkIndirectArrayBoundsForClamping(root);
226
zmo@google.comfd747b82011-04-23 01:30:07 +0000227 // Call mapLongVariableNames() before collectAttribsUniforms() so in
228 // collectAttribsUniforms() we already have the mapped symbol names and
229 // we could composite mapped and original variable names.
daniel@transgaming.com0aa3b5a2012-11-28 19:43:24 +0000230 // Also, if we hash all the names, then no need to do this for long names.
231 if (success && (compileOptions & SH_MAP_LONG_VARIABLE_NAMES) && hashFunction == NULL)
zmo@google.comfd747b82011-04-23 01:30:07 +0000232 mapLongVariableNames(root);
233
gman@chromium.org8d804792012-10-17 21:33:48 +0000234 if (success && (compileOptions & SH_ATTRIBUTES_UNIFORMS)) {
zmo@google.comfd747b82011-04-23 01:30:07 +0000235 collectAttribsUniforms(root);
gman@chromium.org8d804792012-10-17 21:33:48 +0000236 if (compileOptions & SH_ENFORCE_PACKING_RESTRICTIONS) {
237 success = enforcePackingRestrictions();
238 if (!success) {
239 infoSink.info.message(EPrefixError, "too many uniforms");
240 }
241 }
242 }
zmo@google.comfd747b82011-04-23 01:30:07 +0000243
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000244 if (success && (compileOptions & SH_INTERMEDIATE_TREE))
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000245 intermediate.outputTree(root);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000246
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000247 if (success && (compileOptions & SH_OBJECT_CODE))
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000248 translate(root);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000249 }
250
251 // Cleanup memory.
252 intermediate.remove(parseContext.treeRoot);
253 // Ensure symbol table is returned to the built-in level,
254 // throwing away all but the built-ins.
255 while (!symbolTable.atBuiltInLevel())
256 symbolTable.pop();
alokp@chromium.org07620a52010-09-23 17:53:56 +0000257
258 return success;
259}
260
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000261bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources& resources)
alokp@chromium.org07620a52010-09-23 17:53:56 +0000262{
shannon.woods%transgaming.com@gtempaccount.com18b4c4b2013-04-13 03:31:40 +0000263 compileResources = resources;
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +0000264
265 TBuiltIns builtIns;
shannon.woods%transgaming.com@gtempaccount.com5209de82013-04-13 03:41:53 +0000266 builtIns.initialize(shaderType, shaderSpec, resources, extensionBehavior);
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +0000267
268 return InitializeSymbolTable(builtIns, shaderType, shaderSpec, resources, infoSink, symbolTable);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000269}
270
271void TCompiler::clearResults()
272{
daniel@transgaming.com4167cc92013-01-11 04:11:53 +0000273 arrayBoundsClamper.Cleanup();
alokp@chromium.org07620a52010-09-23 17:53:56 +0000274 infoSink.info.erase();
275 infoSink.obj.erase();
276 infoSink.debug.erase();
277
278 attribs.clear();
279 uniforms.clear();
zmo@google.coma3b4ab42011-09-16 00:53:26 +0000280
281 builtInFunctionEmulator.Cleanup();
daniel@transgaming.com0aa3b5a2012-11-28 19:43:24 +0000282
283 nameMap.clear();
alokp@chromium.org07620a52010-09-23 17:53:56 +0000284}
285
zmo@google.comb1762df2011-07-30 02:04:23 +0000286bool TCompiler::detectRecursion(TIntermNode* root)
287{
288 DetectRecursion detect;
289 root->traverse(&detect);
290 switch (detect.detectRecursion()) {
291 case DetectRecursion::kErrorNone:
292 return true;
293 case DetectRecursion::kErrorMissingMain:
294 infoSink.info.message(EPrefixError, "Missing main()");
295 return false;
296 case DetectRecursion::kErrorRecursion:
297 infoSink.info.message(EPrefixError, "Function recursion detected");
298 return false;
299 default:
300 UNREACHABLE();
301 return false;
302 }
303}
304
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +0000305void TCompiler::rewriteCSSShader(TIntermNode* root)
306{
307 RenameFunction renamer("main(", "css_main(");
308 root->traverse(&renamer);
309}
310
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000311bool TCompiler::validateLimitations(TIntermNode* root) {
312 ValidateLimitations validate(shaderType, infoSink.info);
313 root->traverse(&validate);
314 return validate.numErrors() == 0;
315}
316
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000317bool TCompiler::enforceTimingRestrictions(TIntermNode* root, bool outputGraph)
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000318{
319 if (shaderSpec != SH_WEBGL_SPEC) {
320 infoSink.info << "Timing restrictions must be enforced under the WebGL spec.";
321 return false;
322 }
323
324 if (shaderType == SH_FRAGMENT_SHADER) {
325 TDependencyGraph graph(root);
326
327 // Output any errors first.
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000328 bool success = enforceFragmentShaderTimingRestrictions(graph);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000329
330 // Then, output the dependency graph.
331 if (outputGraph) {
332 TDependencyGraphOutput output(infoSink.info);
333 output.outputAllSpanningTrees(graph);
334 }
335
336 return success;
337 }
338 else {
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000339 return enforceVertexShaderTimingRestrictions(root);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000340 }
341}
342
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000343bool TCompiler::enforceFragmentShaderTimingRestrictions(const TDependencyGraph& graph)
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000344{
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000345 RestrictFragmentShaderTiming restrictor(infoSink.info);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000346 restrictor.enforceRestrictions(graph);
347 return restrictor.numErrors() == 0;
348}
349
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000350bool TCompiler::enforceVertexShaderTimingRestrictions(TIntermNode* root)
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000351{
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000352 RestrictVertexShaderTiming restrictor(infoSink.info);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000353 restrictor.enforceRestrictions(root);
354 return restrictor.numErrors() == 0;
355}
356
alokp@chromium.org07620a52010-09-23 17:53:56 +0000357void TCompiler::collectAttribsUniforms(TIntermNode* root)
358{
daniel@transgaming.com0aa3b5a2012-11-28 19:43:24 +0000359 CollectAttribsUniforms collect(attribs, uniforms, hashFunction);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000360 root->traverse(&collect);
361}
zmo@google.comfd747b82011-04-23 01:30:07 +0000362
gman@chromium.org8d804792012-10-17 21:33:48 +0000363bool TCompiler::enforcePackingRestrictions()
364{
365 VariablePacker packer;
366 return packer.CheckVariablesWithinPackingLimits(maxUniformVectors, uniforms);
367}
368
zmo@google.comfd747b82011-04-23 01:30:07 +0000369void TCompiler::mapLongVariableNames(TIntermNode* root)
370{
zmo@google.comb9f64aa2012-01-20 00:35:15 +0000371 ASSERT(longNameMap);
372 MapLongVariableNames map(longNameMap);
zmo@google.com9996b8e2012-01-19 01:43:55 +0000373 root->traverse(&map);
zmo@google.comfd747b82011-04-23 01:30:07 +0000374}
375
376int TCompiler::getMappedNameMaxLength() const
377{
kbr@chromium.org22152112011-10-26 01:18:28 +0000378 return MAX_SHORTENED_IDENTIFIER_SIZE + 1;
zmo@google.comfd747b82011-04-23 01:30:07 +0000379}
zmo@google.com5601ea02011-06-10 18:23:25 +0000380
381const TExtensionBehavior& TCompiler::getExtensionBehavior() const
382{
383 return extensionBehavior;
384}
zmo@google.com32e97312011-08-24 01:03:11 +0000385
shannon.woods%transgaming.com@gtempaccount.com18b4c4b2013-04-13 03:31:40 +0000386const ShBuiltInResources& TCompiler::getResources() const
387{
388 return compileResources;
389}
390
daniel@transgaming.com4167cc92013-01-11 04:11:53 +0000391const ArrayBoundsClamper& TCompiler::getArrayBoundsClamper() const
392{
393 return arrayBoundsClamper;
394}
395
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000396ShArrayIndexClampingStrategy TCompiler::getArrayIndexClampingStrategy() const
397{
398 return clampingStrategy;
399}
400
401const BuiltInFunctionEmulator& TCompiler::getBuiltInFunctionEmulator() const
402{
403 return builtInFunctionEmulator;
404}