14df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni/* 24df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Copyright 2017, The Android Open Source Project 34df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * 44df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Licensed under the Apache License, Version 2.0 (the "License"); 54df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * you may not use this file except in compliance with the License. 64df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * You may obtain a copy of the License at 74df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * 84df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * http://www.apache.org/licenses/LICENSE-2.0 94df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * 104df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Unless required by applicable law or agreed to in writing, software 114df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * distributed under the License is distributed on an "AS IS" BASIS, 124df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * See the License for the specific language governing permissions and 144df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * limitations under the License. 154df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni */ 164df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 174df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "transformer.h" 184df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 194df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "module.h" 204df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 214df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace android { 224df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace spirit { 234df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 243f30b6202dd5ad6ff66959131d216405850ed152Yang NiModule *Transformer::run(Module *module, int *error) { 253f30b6202dd5ad6ff66959131d216405850ed152Yang Ni auto words = runAndSerialize(module, error); 263e5fbb6faf66488ba49c9d2396350ae567dba315Yang Ni return Deserialize<Module>(words); 274df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} 284df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 293f30b6202dd5ad6ff66959131d216405850ed152Yang Nistd::vector<uint32_t> Transformer::runAndSerialize(Module *m, int *error) { 303f30b6202dd5ad6ff66959131d216405850ed152Yang Ni mModule = m; 313f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 323f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // Since contents in the decoration or global section may change, transform 333f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // and serialize the function definitions first. 343f30b6202dd5ad6ff66959131d216405850ed152Yang Ni mVisit = 0; 353f30b6202dd5ad6ff66959131d216405850ed152Yang Ni mShouldRecord = false; 363f30b6202dd5ad6ff66959131d216405850ed152Yang Ni mStream = mStreamFunctions.get(); 373f30b6202dd5ad6ff66959131d216405850ed152Yang Ni m->accept(this); 383f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 393f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // Record in the annotation section any new annotations added 403f30b6202dd5ad6ff66959131d216405850ed152Yang Ni m->consolidateAnnotations(); 413f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 423f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // After the functions are transformed, serialize the other sections to 433f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // capture any changes made during the function transformation, and append 443f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // the new words from function serialization. 453f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 463f30b6202dd5ad6ff66959131d216405850ed152Yang Ni mVisit = 1; 473f30b6202dd5ad6ff66959131d216405850ed152Yang Ni mShouldRecord = true; 483f30b6202dd5ad6ff66959131d216405850ed152Yang Ni mStream = mStreamFinal.get(); 493f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 503f30b6202dd5ad6ff66959131d216405850ed152Yang Ni // TODO fix Module::accept() to have the header serialization code there 514df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni m->SerializeHeader(*mStream); 524df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni m->accept(this); 533f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 543f30b6202dd5ad6ff66959131d216405850ed152Yang Ni auto output = mStream->getWords(); 553f30b6202dd5ad6ff66959131d216405850ed152Yang Ni auto functions = mStreamFunctions->getWords(); 563f30b6202dd5ad6ff66959131d216405850ed152Yang Ni output.insert(output.end(), functions.begin(), functions.end()); 573f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 583f30b6202dd5ad6ff66959131d216405850ed152Yang Ni if (error) { 593f30b6202dd5ad6ff66959131d216405850ed152Yang Ni *error = 0; 603f30b6202dd5ad6ff66959131d216405850ed152Yang Ni } 613f30b6202dd5ad6ff66959131d216405850ed152Yang Ni 623f30b6202dd5ad6ff66959131d216405850ed152Yang Ni return output; 634df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} 644df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 654df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nivoid Transformer::insert(Instruction *inst) { 664df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni // TODO: warn on nullptr inst 674df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni inst->Serialize(*mStream); 684df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} 694df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni 704df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace spirit 714df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace android 72