blob: 9868580c424ffe904db17b90c8c35c2a0f45eeb9 [file] [log] [blame]
Logan2a6dc822011-01-06 04:05:20 +08001/*
2 * Copyright 2010, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "bcc"
18#include <cutils/log.h>
19
20#include "ScriptCompiled.h"
21
Logan02286cb2011-01-07 00:30:47 +080022#include "ContextManager.h"
Logan7dcaac92011-01-06 04:26:23 +080023#include "EmittedFuncInfo.h"
24
Logan2a6dc822011-01-06 04:05:20 +080025namespace bcc {
26
Logan7dcaac92011-01-06 04:26:23 +080027ScriptCompiled::~ScriptCompiled() {
Logan02286cb2011-01-07 00:30:47 +080028 // Deallocate the BCC context
29 if (mContext) {
30 deallocateContext(mContext);
31 }
32
33 // Delete the emitted function information
Logan7dcaac92011-01-06 04:26:23 +080034 for (EmittedFunctionsMapTy::iterator I = mEmittedFunctions.begin(),
35 E = mEmittedFunctions.end(); I != E; I++) {
36 if (I->second != NULL) {
37 delete I->second;
38 }
39 }
Logan7dcaac92011-01-06 04:26:23 +080040}
41
Loganbe79ada2011-01-13 01:33:45 +080042void ScriptCompiled::getExportVarList(size_t varListSize, void **varList) {
43 if (varList) {
44 size_t varCount = getExportVarCount();
45
46 if (varCount > varListSize) {
47 varCount = varListSize;
48 }
49
Logan2a6dc822011-01-06 04:05:20 +080050 for (ExportVarList::const_iterator
Loganbe79ada2011-01-13 01:33:45 +080051 I = mExportVars.begin(), E = mExportVars.end();
52 I != E && varCount > 0; ++I, --varCount) {
53 *varList++ = *I;
Logan2a6dc822011-01-06 04:05:20 +080054 }
55 }
56}
57
58
Loganbe79ada2011-01-13 01:33:45 +080059void ScriptCompiled::getExportFuncList(size_t funcListSize, void **funcList) {
60 if (funcList) {
61 size_t funcCount = getExportFuncCount();
62
63 if (funcCount > funcListSize) {
64 funcCount = funcListSize;
65 }
66
Logan2a6dc822011-01-06 04:05:20 +080067 for (ExportFuncList::const_iterator
Loganbe79ada2011-01-13 01:33:45 +080068 I = mExportFuncs.begin(), E = mExportFuncs.end();
69 I != E && funcCount > 0; ++I, --funcCount) {
70 *funcList++ = *I;
Logan2a6dc822011-01-06 04:05:20 +080071 }
72 }
73}
74
75
Loganbe79ada2011-01-13 01:33:45 +080076void ScriptCompiled::getPragmaList(size_t pragmaListSize,
77 char const **keyList,
78 char const **valueList) {
79 size_t pragmaCount = getPragmaCount();
Logan2a6dc822011-01-06 04:05:20 +080080
Loganbe79ada2011-01-13 01:33:45 +080081 if (pragmaCount > pragmaListSize) {
82 pragmaCount = pragmaListSize;
83 }
84
85 for (PragmaList::const_iterator
86 I = mPragmas.begin(), E = mPragmas.end();
87 I != E && pragmaCount > 0; ++I, --pragmaCount) {
88 if (keyList) { *keyList++ = I->first.c_str(); }
89 if (valueList) { *valueList++ = I->second.c_str(); }
Logan2a6dc822011-01-06 04:05:20 +080090 }
91}
92
Logan7dcaac92011-01-06 04:26:23 +080093
94void *ScriptCompiled::lookup(const char *name) {
Logan7dcaac92011-01-06 04:26:23 +080095 EmittedFunctionsMapTy::const_iterator I = mEmittedFunctions.find(name);
96 return (I == mEmittedFunctions.end()) ? NULL : I->second->Code;
97}
98
99
Loganbe79ada2011-01-13 01:33:45 +0800100void ScriptCompiled::getFuncNameList(size_t funcNameListSize,
101 char const **funcNameList) {
102 if (funcNameList) {
103 size_t funcCount = getFuncCount();
Logan7dcaac92011-01-06 04:26:23 +0800104
Loganbe79ada2011-01-13 01:33:45 +0800105 if (funcCount > funcNameListSize) {
106 funcCount = funcNameListSize;
107 }
Logan7dcaac92011-01-06 04:26:23 +0800108
Logan7dcaac92011-01-06 04:26:23 +0800109 for (EmittedFunctionsMapTy::const_iterator
110 I = mEmittedFunctions.begin(), E = mEmittedFunctions.end();
Loganbe79ada2011-01-13 01:33:45 +0800111 I != E && funcCount > 0; ++I, --funcCount) {
112 *funcNameList++ = I->first.c_str();
Logan7dcaac92011-01-06 04:26:23 +0800113 }
114 }
115}
116
117
Loganbe79ada2011-01-13 01:33:45 +0800118void ScriptCompiled::getFuncBinary(char const *funcname,
119 void **base,
120 size_t *length) {
Logan7dcaac92011-01-06 04:26:23 +0800121 EmittedFunctionsMapTy::const_iterator I = mEmittedFunctions.find(funcname);
Loganbe79ada2011-01-13 01:33:45 +0800122
123#define DEREF_ASSIGN(VAR, VALUE) if (VAR) { *(VAR) = (VALUE); }
124
Logan7dcaac92011-01-06 04:26:23 +0800125 if (I == mEmittedFunctions.end()) {
Loganbe79ada2011-01-13 01:33:45 +0800126 DEREF_ASSIGN(base, NULL);
127 DEREF_ASSIGN(length, 0);
Logan7dcaac92011-01-06 04:26:23 +0800128 } else {
Loganbe79ada2011-01-13 01:33:45 +0800129 DEREF_ASSIGN(base, I->second->Code);
130 DEREF_ASSIGN(length, I->second->Size);
Logan7dcaac92011-01-06 04:26:23 +0800131 }
Loganbe79ada2011-01-13 01:33:45 +0800132
133#undef DEREF_ASSIGN
Logan7dcaac92011-01-06 04:26:23 +0800134}
135
136
Logan2a6dc822011-01-06 04:05:20 +0800137} // namespace bcc