Compiler.cpp revision 9af1e4d23ffa811fdf027d7e95a4dd3fc24b2113
1/*
2 * Copyright 2010-2012, 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#include "Compiler.h"
18
19#include "Config.h"
20
21#if USE_OLD_JIT
22#include "OldJIT/ContextManager.h"
23#endif
24
25#if USE_DISASSEMBLER
26#include "Disassembler/Disassembler.h"
27#endif
28
29#include "DebugHelper.h"
30#include "FileHandle.h"
31#include "Runtime.h"
32#include "ScriptCompiled.h"
33#include "Sha1Helper.h"
34#include "CompilerOption.h"
35
36#if USE_MCJIT
37#include "librsloader.h"
38#endif
39
40#include "Transforms/BCCTransforms.h"
41
42#include "llvm/ADT/StringRef.h"
43
44#include "llvm/Analysis/Passes.h"
45
46#include "llvm/CodeGen/Passes.h"
47#include "llvm/CodeGen/RegAllocRegistry.h"
48#include "llvm/CodeGen/SchedulerRegistry.h"
49
50#include "llvm/MC/MCContext.h"
51#include "llvm/MC/SubtargetFeature.h"
52
53#include "llvm/Transforms/IPO.h"
54#include "llvm/Transforms/Scalar.h"
55
56#include "llvm/Target/TargetData.h"
57#include "llvm/Target/TargetMachine.h"
58
59#include "llvm/Support/ErrorHandling.h"
60#include "llvm/Support/FormattedStream.h"
61#include "llvm/Support/TargetRegistry.h"
62#include "llvm/Support/TargetSelect.h"
63#include "llvm/Support/raw_ostream.h"
64
65#include "llvm/Constants.h"
66#include "llvm/GlobalValue.h"
67#include "llvm/Linker.h"
68#include "llvm/LLVMContext.h"
69#include "llvm/Metadata.h"
70#include "llvm/Module.h"
71#include "llvm/PassManager.h"
72#include "llvm/Type.h"
73#include "llvm/Value.h"
74
75#include <errno.h>
76#include <sys/file.h>
77#include <sys/stat.h>
78#include <sys/types.h>
79#include <unistd.h>
80
81#include <string.h>
82
83#include <algorithm>
84#include <iterator>
85#include <string>
86#include <vector>
87
88extern char* gDebugDumpDirectory;
89
90namespace bcc {
91
92//////////////////////////////////////////////////////////////////////////////
93// BCC Compiler Static Variables
94//////////////////////////////////////////////////////////////////////////////
95
96bool Compiler::GlobalInitialized = false;
97
98
99#if !defined(__HOST__)
100  #define TARGET_TRIPLE_STRING  DEFAULT_TARGET_TRIPLE_STRING
101#else
102// In host TARGET_TRIPLE_STRING is a variable to allow cross-compilation.
103  #if defined(__cplusplus)
104    extern "C" {
105  #endif
106      char *TARGET_TRIPLE_STRING = (char*)DEFAULT_TARGET_TRIPLE_STRING;
107  #if defined(__cplusplus)
108    };
109  #endif
110#endif
111
112// Code generation optimization level for the compiler
113llvm::CodeGenOpt::Level Compiler::CodeGenOptLevel;
114
115std::string Compiler::Triple;
116llvm::Triple::ArchType Compiler::ArchType;
117
118std::string Compiler::CPU;
119
120std::vector<std::string> Compiler::Features;
121
122// Name of metadata node where pragma info resides (should be synced with
123// slang.cpp)
124const llvm::StringRef Compiler::PragmaMetadataName = "#pragma";
125
126// Name of metadata node where exported variable names reside (should be
127// synced with slang_rs_metadata.h)
128const llvm::StringRef Compiler::ExportVarMetadataName = "#rs_export_var";
129
130// Name of metadata node where exported function names reside (should be
131// synced with slang_rs_metadata.h)
132const llvm::StringRef Compiler::ExportFuncMetadataName = "#rs_export_func";
133
134// Name of metadata node where exported ForEach name information resides
135// (should be synced with slang_rs_metadata.h)
136const llvm::StringRef Compiler::ExportForEachNameMetadataName =
137    "#rs_export_foreach_name";
138
139// Name of metadata node where exported ForEach signature information resides
140// (should be synced with slang_rs_metadata.h)
141const llvm::StringRef Compiler::ExportForEachMetadataName =
142    "#rs_export_foreach";
143
144// Name of metadata node where RS object slot info resides (should be
145// synced with slang_rs_metadata.h)
146const llvm::StringRef Compiler::ObjectSlotMetadataName = "#rs_object_slots";
147
148// Name of metadata node where RS optimization level resides (should be
149// synced with slang_rs_metadata.h)
150const llvm::StringRef OptimizationLevelMetadataName = "#optimization_level";
151
152
153
154//////////////////////////////////////////////////////////////////////////////
155// Compiler
156//////////////////////////////////////////////////////////////////////////////
157
158void Compiler::GlobalInitialization() {
159  if (GlobalInitialized) {
160    return;
161  }
162
163#if defined(PROVIDE_ARM_CODEGEN)
164  LLVMInitializeARMAsmPrinter();
165  LLVMInitializeARMTargetMC();
166  LLVMInitializeARMTargetInfo();
167  LLVMInitializeARMTarget();
168#endif
169
170#if defined(PROVIDE_MIPS_CODEGEN)
171  LLVMInitializeMipsAsmPrinter();
172  LLVMInitializeMipsTargetMC();
173  LLVMInitializeMipsTargetInfo();
174  LLVMInitializeMipsTarget();
175#endif
176
177#if defined(PROVIDE_X86_CODEGEN)
178  LLVMInitializeX86AsmPrinter();
179  LLVMInitializeX86TargetMC();
180  LLVMInitializeX86TargetInfo();
181  LLVMInitializeX86Target();
182#endif
183
184#if USE_DISASSEMBLER
185  InitializeDisassembler();
186#endif
187
188  // if (!llvm::llvm_is_multithreaded())
189  //   llvm::llvm_start_multithreaded();
190
191  // Set Triple, CPU and Features here
192  Triple = TARGET_TRIPLE_STRING;
193
194  // Determine ArchType
195#if defined(__HOST__)
196  {
197    std::string Err;
198    llvm::Target const *Target = llvm::TargetRegistry::lookupTarget(Triple, Err);
199    if (Target != NULL) {
200      ArchType = llvm::Triple::getArchTypeForLLVMName(Target->getName());
201    } else {
202      ArchType = llvm::Triple::UnknownArch;
203      ALOGE("%s", Err.c_str());
204    }
205  }
206#elif defined(DEFAULT_ARM_CODEGEN)
207  ArchType = llvm::Triple::arm;
208#elif defined(DEFAULT_MIPS_CODEGEN)
209  ArchType = llvm::Triple::mipsel;
210#elif defined(DEFAULT_X86_CODEGEN)
211  ArchType = llvm::Triple::x86;
212#elif defined(DEFAULT_X86_64_CODEGEN)
213  ArchType = llvm::Triple::x86_64;
214#else
215  ArchType = llvm::Triple::UnknownArch;
216#endif
217
218  if ((ArchType == llvm::Triple::arm) || (ArchType == llvm::Triple::thumb)) {
219#  if defined(ARCH_ARM_HAVE_VFP)
220    Features.push_back("+vfp3");
221#  if !defined(ARCH_ARM_HAVE_VFP_D32)
222    Features.push_back("+d16");
223#  endif
224#  endif
225
226#  if defined(ARCH_ARM_HAVE_NEON)
227    Features.push_back("+neon");
228    Features.push_back("+neonfp");
229#  else
230    Features.push_back("-neon");
231    Features.push_back("-neonfp");
232#  endif
233
234// FIXME(all): Turn NEON back on after debugging the rebase.
235#  if 1 || defined(DISABLE_ARCH_ARM_HAVE_NEON)
236    Features.push_back("-neon");
237    Features.push_back("-neonfp");
238#  endif
239  }
240
241  // Register the scheduler
242  llvm::RegisterScheduler::setDefault(llvm::createDefaultScheduler);
243
244#if USE_CACHE
245  // Read in SHA1 checksum of libbcc and libRS.
246  readSHA1(sha1LibBCC_SHA1, sizeof(sha1LibBCC_SHA1), pathLibBCC_SHA1);
247
248  calcFileSHA1(sha1LibRS, pathLibRS);
249#endif
250
251  GlobalInitialized = true;
252}
253
254
255void Compiler::LLVMErrorHandler(void *UserData, const std::string &Message) {
256  std::string *Error = static_cast<std::string*>(UserData);
257  Error->assign(Message);
258  ALOGE("%s", Message.c_str());
259  exit(1);
260}
261
262
263#if USE_OLD_JIT
264CodeMemoryManager *Compiler::createCodeMemoryManager() {
265  mCodeMemMgr.reset(new CodeMemoryManager());
266  return mCodeMemMgr.get();
267}
268#endif
269
270
271#if USE_OLD_JIT
272CodeEmitter *Compiler::createCodeEmitter() {
273  mCodeEmitter.reset(new CodeEmitter(mpResult, mCodeMemMgr.get()));
274  return mCodeEmitter.get();
275}
276#endif
277
278
279Compiler::Compiler(ScriptCompiled *result)
280  : mpResult(result),
281#if USE_MCJIT
282    mRSExecutable(NULL),
283#endif
284    mpSymbolLookupFn(NULL),
285    mpSymbolLookupContext(NULL),
286    mModule(NULL),
287    mHasLinked(false) /* Turn off linker */ {
288  llvm::remove_fatal_error_handler();
289  llvm::install_fatal_error_handler(LLVMErrorHandler, &mError);
290  return;
291}
292
293
294int Compiler::linkModule(llvm::Module *moduleWith) {
295  if (llvm::Linker::LinkModules(mModule, moduleWith,
296                                llvm::Linker::PreserveSource,
297                                &mError) != 0) {
298    return hasError();
299  }
300
301  // Everything for linking should be settled down here with no error occurs
302  mHasLinked = true;
303  return hasError();
304}
305
306
307int Compiler::compile(const CompilerOption &option) {
308  llvm::Target const *Target = NULL;
309  llvm::TargetData *TD = NULL;
310  llvm::TargetMachine *TM = NULL;
311
312  std::string FeaturesStr;
313
314  if (mModule == NULL)  // No module was loaded
315    return 0;
316
317  llvm::NamedMDNode const *PragmaMetadata;
318  llvm::NamedMDNode const *ExportVarMetadata;
319  llvm::NamedMDNode const *ExportFuncMetadata;
320  llvm::NamedMDNode const *ExportForEachNameMetadata;
321  llvm::NamedMDNode const *ExportForEachMetadata;
322  llvm::NamedMDNode const *ObjectSlotMetadata;
323
324  std::vector<std::string> ForEachNameList;
325  std::vector<std::string> ForEachExpandList;
326  std::vector<uint32_t> forEachSigList;
327
328  llvm::NamedMDNode const *OptimizationLevelMetadata =
329    mModule->getNamedMetadata(OptimizationLevelMetadataName);
330
331  // Default to maximum optimization in the absence of named metadata node
332  int OptimizationLevel = 3;
333  if (OptimizationLevelMetadata) {
334    llvm::ConstantInt* OL = llvm::dyn_cast<llvm::ConstantInt>(
335      OptimizationLevelMetadata->getOperand(0)->getOperand(0));
336    OptimizationLevel = OL->getZExtValue();
337  }
338
339  if (OptimizationLevel == 0) {
340    CodeGenOptLevel = llvm::CodeGenOpt::None;
341  } else if (OptimizationLevel == 1) {
342    CodeGenOptLevel = llvm::CodeGenOpt::Less;
343  } else if (OptimizationLevel == 2) {
344    CodeGenOptLevel = llvm::CodeGenOpt::Default;
345  } else if (OptimizationLevel == 3) {
346    CodeGenOptLevel = llvm::CodeGenOpt::Aggressive;
347  }
348
349  // not the best place for this, but we need to set the register allocation
350  // policy after we read the optimization_level metadata from the bitcode
351
352  // Register allocation policy:
353  //  createFastRegisterAllocator: fast but bad quality
354  //  createLinearScanRegisterAllocator: not so fast but good quality
355  llvm::RegisterRegAlloc::setDefault
356    ((CodeGenOptLevel == llvm::CodeGenOpt::None) ?
357     llvm::createFastRegisterAllocator :
358     llvm::createGreedyRegisterAllocator);
359
360  // Find LLVM Target
361  Target = llvm::TargetRegistry::lookupTarget(Triple, mError);
362  if (hasError())
363    goto on_bcc_compile_error;
364
365  if (!CPU.empty() || !Features.empty()) {
366    llvm::SubtargetFeatures F;
367
368    for (std::vector<std::string>::const_iterator
369         I = Features.begin(), E = Features.end(); I != E; I++) {
370      F.AddFeature(*I);
371    }
372
373    FeaturesStr = F.getString();
374  }
375
376  // Create LLVM Target Machine
377  TM = Target->createTargetMachine(Triple, CPU, FeaturesStr,
378                                   option.TargetOpt,
379                                   option.RelocModelOpt,
380                                   option.CodeModelOpt);
381
382  if (TM == NULL) {
383    setError("Failed to create target machine implementation for the"
384             " specified triple '" + Triple + "'");
385    goto on_bcc_compile_error;
386  }
387
388  // Get target data from Module
389  TD = new llvm::TargetData(mModule);
390
391  // Load named metadata
392  ExportVarMetadata = mModule->getNamedMetadata(ExportVarMetadataName);
393  ExportFuncMetadata = mModule->getNamedMetadata(ExportFuncMetadataName);
394  ExportForEachNameMetadata =
395      mModule->getNamedMetadata(ExportForEachNameMetadataName);
396  ExportForEachMetadata =
397      mModule->getNamedMetadata(ExportForEachMetadataName);
398  PragmaMetadata = mModule->getNamedMetadata(PragmaMetadataName);
399  ObjectSlotMetadata = mModule->getNamedMetadata(ObjectSlotMetadataName);
400
401  if (ExportForEachNameMetadata) {
402    for (int i = 0, e = ExportForEachNameMetadata->getNumOperands();
403         i != e;
404         i++) {
405      llvm::MDNode *ExportForEach = ExportForEachNameMetadata->getOperand(i);
406      if (ExportForEach != NULL && ExportForEach->getNumOperands() > 0) {
407        llvm::Value *ExportForEachNameMDS = ExportForEach->getOperand(0);
408        if (ExportForEachNameMDS->getValueID() == llvm::Value::MDStringVal) {
409          llvm::StringRef ExportForEachName =
410            static_cast<llvm::MDString*>(ExportForEachNameMDS)->getString();
411          ForEachNameList.push_back(ExportForEachName.str());
412          std::string ExpandName = ExportForEachName.str() + ".expand";
413          ForEachExpandList.push_back(ExpandName);
414        }
415      }
416    }
417  }
418
419  if (ExportForEachMetadata) {
420    for (int i = 0, e = ExportForEachMetadata->getNumOperands(); i != e; i++) {
421      llvm::MDNode *SigNode = ExportForEachMetadata->getOperand(i);
422      if (SigNode != NULL && SigNode->getNumOperands() == 1) {
423        llvm::Value *SigVal = SigNode->getOperand(0);
424        if (SigVal->getValueID() == llvm::Value::MDStringVal) {
425          llvm::StringRef SigString =
426              static_cast<llvm::MDString*>(SigVal)->getString();
427          uint32_t Signature = 0;
428          if (SigString.getAsInteger(10, Signature)) {
429            ALOGE("Non-integer signature value '%s'", SigString.str().c_str());
430            goto on_bcc_compile_error;
431          }
432          forEachSigList.push_back(Signature);
433        }
434      }
435    }
436  }
437
438  runInternalPasses(ForEachNameList, forEachSigList);
439
440  // Perform link-time optimization if we have multiple modules
441  if (mHasLinked) {
442    runLTO(new llvm::TargetData(*TD), ExportVarMetadata, ExportFuncMetadata,
443           ForEachExpandList, CodeGenOptLevel);
444  }
445
446  // Perform code generation
447#if USE_OLD_JIT
448  if (runCodeGen(new llvm::TargetData(*TD), TM,
449                 ExportVarMetadata, ExportFuncMetadata) != 0) {
450    goto on_bcc_compile_error;
451  }
452#endif
453
454#if USE_MCJIT
455  if (runMCCodeGen(new llvm::TargetData(*TD), TM) != 0) {
456    goto on_bcc_compile_error;
457  }
458
459  if (!option.LoadAfterCompile)
460    return 0;
461
462  // Load the ELF Object
463  mRSExecutable =
464    rsloaderCreateExec((unsigned char *)&*mEmittedELFExecutable.begin(),
465                       mEmittedELFExecutable.size(),
466                       &resolveSymbolAdapter, this);
467
468  if (!mRSExecutable) {
469    setError("Fail to load emitted ELF relocatable file");
470    goto on_bcc_compile_error;
471  }
472
473  rsloaderUpdateSectionHeaders(mRSExecutable,
474    (unsigned char*) mEmittedELFExecutable.begin());
475
476  if (ExportVarMetadata) {
477    ScriptCompiled::ExportVarList &varList = mpResult->mExportVars;
478    std::vector<std::string> &varNameList = mpResult->mExportVarsName;
479
480    for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) {
481      llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i);
482      if (ExportVar != NULL && ExportVar->getNumOperands() > 1) {
483        llvm::Value *ExportVarNameMDS = ExportVar->getOperand(0);
484        if (ExportVarNameMDS->getValueID() == llvm::Value::MDStringVal) {
485          llvm::StringRef ExportVarName =
486            static_cast<llvm::MDString*>(ExportVarNameMDS)->getString();
487
488          varList.push_back(
489            rsloaderGetSymbolAddress(mRSExecutable,
490                                     ExportVarName.str().c_str()));
491          varNameList.push_back(ExportVarName.str());
492#if DEBUG_MCJIT_REFLECT
493          ALOGD("runMCCodeGen(): Exported Var: %s @ %p\n", ExportVarName.str().c_str(),
494               varList.back());
495#endif
496          continue;
497        }
498      }
499
500      varList.push_back(NULL);
501    }
502  }
503
504  if (ExportFuncMetadata) {
505    ScriptCompiled::ExportFuncList &funcList = mpResult->mExportFuncs;
506    std::vector<std::string> &funcNameList = mpResult->mExportFuncsName;
507
508    for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) {
509      llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i);
510      if (ExportFunc != NULL && ExportFunc->getNumOperands() > 0) {
511        llvm::Value *ExportFuncNameMDS = ExportFunc->getOperand(0);
512        if (ExportFuncNameMDS->getValueID() == llvm::Value::MDStringVal) {
513          llvm::StringRef ExportFuncName =
514            static_cast<llvm::MDString*>(ExportFuncNameMDS)->getString();
515
516          funcList.push_back(
517            rsloaderGetSymbolAddress(mRSExecutable,
518                                     ExportFuncName.str().c_str()));
519          funcNameList.push_back(ExportFuncName.str());
520#if DEBUG_MCJIT_RELECT
521          ALOGD("runMCCodeGen(): Exported Func: %s @ %p\n", ExportFuncName.str().c_str(),
522               funcList.back());
523#endif
524        }
525      }
526    }
527  }
528
529  if (ExportForEachNameMetadata) {
530    ScriptCompiled::ExportForEachList &forEachList = mpResult->mExportForEach;
531    std::vector<std::string> &ForEachNameList = mpResult->mExportForEachName;
532
533    for (int i = 0, e = ExportForEachNameMetadata->getNumOperands();
534         i != e;
535         i++) {
536      llvm::MDNode *ExportForEach = ExportForEachNameMetadata->getOperand(i);
537      if (ExportForEach != NULL && ExportForEach->getNumOperands() > 0) {
538        llvm::Value *ExportForEachNameMDS = ExportForEach->getOperand(0);
539        if (ExportForEachNameMDS->getValueID() == llvm::Value::MDStringVal) {
540          llvm::StringRef ExportForEachName =
541            static_cast<llvm::MDString*>(ExportForEachNameMDS)->getString();
542          std::string Name = ExportForEachName.str() + ".expand";
543
544          forEachList.push_back(
545              rsloaderGetSymbolAddress(mRSExecutable, Name.c_str()));
546          ForEachNameList.push_back(Name);
547        }
548      }
549    }
550  }
551
552#if DEBUG_MCJIT_DISASSEMBLER
553  {
554    // Get MC codegen emitted function name list
555    size_t func_list_size = rsloaderGetFuncCount(mRSExecutable);
556    std::vector<char const *> func_list(func_list_size, NULL);
557    rsloaderGetFuncNameList(mRSExecutable, func_list_size, &*func_list.begin());
558
559    // Disassemble each function
560    for (size_t i = 0; i < func_list_size; ++i) {
561      void *func = rsloaderGetSymbolAddress(mRSExecutable, func_list[i]);
562      if (func) {
563        size_t size = rsloaderGetSymbolSize(mRSExecutable, func_list[i]);
564        Disassemble(DEBUG_MCJIT_DISASSEMBLER_FILE,
565                    Target, TM, func_list[i], (unsigned char const *)func, size);
566      }
567    }
568  }
569#endif
570#endif
571
572  // Read pragma information from the metadata node of the module.
573  if (PragmaMetadata) {
574    ScriptCompiled::PragmaList &pragmaList = mpResult->mPragmas;
575
576    for (int i = 0, e = PragmaMetadata->getNumOperands(); i != e; i++) {
577      llvm::MDNode *Pragma = PragmaMetadata->getOperand(i);
578      if (Pragma != NULL &&
579          Pragma->getNumOperands() == 2 /* should have exactly 2 operands */) {
580        llvm::Value *PragmaNameMDS = Pragma->getOperand(0);
581        llvm::Value *PragmaValueMDS = Pragma->getOperand(1);
582
583        if ((PragmaNameMDS->getValueID() == llvm::Value::MDStringVal) &&
584            (PragmaValueMDS->getValueID() == llvm::Value::MDStringVal)) {
585          llvm::StringRef PragmaName =
586            static_cast<llvm::MDString*>(PragmaNameMDS)->getString();
587          llvm::StringRef PragmaValue =
588            static_cast<llvm::MDString*>(PragmaValueMDS)->getString();
589
590          pragmaList.push_back(
591            std::make_pair(std::string(PragmaName.data(),
592                                       PragmaName.size()),
593                           std::string(PragmaValue.data(),
594                                       PragmaValue.size())));
595#if DEBUG_BCC_REFLECT
596          ALOGD("compile(): Pragma: %s -> %s\n",
597               pragmaList.back().first.c_str(),
598               pragmaList.back().second.c_str());
599#endif
600        }
601      }
602    }
603  }
604
605  if (ObjectSlotMetadata) {
606    ScriptCompiled::ObjectSlotList &objectSlotList = mpResult->mObjectSlots;
607
608    for (int i = 0, e = ObjectSlotMetadata->getNumOperands(); i != e; i++) {
609      llvm::MDNode *ObjectSlot = ObjectSlotMetadata->getOperand(i);
610      if (ObjectSlot != NULL &&
611          ObjectSlot->getNumOperands() == 1) {
612        llvm::Value *SlotMDS = ObjectSlot->getOperand(0);
613        if (SlotMDS->getValueID() == llvm::Value::MDStringVal) {
614          llvm::StringRef Slot =
615              static_cast<llvm::MDString*>(SlotMDS)->getString();
616          uint32_t USlot = 0;
617          if (Slot.getAsInteger(10, USlot)) {
618            setError("Non-integer object slot value '" + Slot.str() + "'");
619            goto on_bcc_compile_error;
620          }
621          objectSlotList.push_back(USlot);
622#if DEBUG_BCC_REFLECT
623          ALOGD("compile(): RefCount Slot: %s @ %u\n", Slot.str().c_str(), USlot);
624#endif
625        }
626      }
627    }
628  }
629
630on_bcc_compile_error:
631  // ALOGE("on_bcc_compiler_error");
632  if (TD) {
633    delete TD;
634  }
635
636  if (TM) {
637    delete TM;
638  }
639
640  if (mError.empty()) {
641    return 0;
642  }
643
644  // ALOGE(getErrorMessage());
645  return 1;
646}
647
648
649#if USE_OLD_JIT
650int Compiler::runCodeGen(llvm::TargetData *TD, llvm::TargetMachine *TM,
651                         llvm::NamedMDNode const *ExportVarMetadata,
652                         llvm::NamedMDNode const *ExportFuncMetadata) {
653  // Create memory manager for creation of code emitter later.
654  if (!mCodeMemMgr.get() && !createCodeMemoryManager()) {
655    setError("Failed to startup memory management for further compilation");
656    return 1;
657  }
658
659  mpResult->mContext = (char *) (mCodeMemMgr.get()->getCodeMemBase());
660
661  // Create code emitter
662  if (!mCodeEmitter.get()) {
663    if (!createCodeEmitter()) {
664      setError("Failed to create machine code emitter for compilation");
665      return 1;
666    }
667  } else {
668    // Reuse the code emitter
669    mCodeEmitter->reset();
670  }
671
672  mCodeEmitter->setTargetMachine(*TM);
673  mCodeEmitter->registerSymbolCallback(mpSymbolLookupFn,
674                                       mpSymbolLookupContext);
675
676  // Create code-gen pass to run the code emitter
677  llvm::OwningPtr<llvm::FunctionPassManager> CodeGenPasses(
678    new llvm::FunctionPassManager(mModule));
679
680  // Add TargetData to code generation pass manager
681  CodeGenPasses->add(TD);
682
683  // Add code emit passes
684  if (TM->addPassesToEmitMachineCode(*CodeGenPasses,
685                                     *mCodeEmitter,
686                                     CodeGenOptLevel)) {
687    setError("The machine code emission is not supported on '" + Triple + "'");
688    return 1;
689  }
690
691  // Run the code emitter on every non-declaration function in the module
692  CodeGenPasses->doInitialization();
693  for (llvm::Module::iterator
694       I = mModule->begin(), E = mModule->end(); I != E; I++) {
695    if (!I->isDeclaration()) {
696      CodeGenPasses->run(*I);
697    }
698  }
699
700  CodeGenPasses->doFinalization();
701
702  // Copy the global address mapping from code emitter and remapping
703  if (ExportVarMetadata) {
704    ScriptCompiled::ExportVarList &varList = mpResult->mExportVars;
705
706    for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) {
707      llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i);
708      if (ExportVar != NULL && ExportVar->getNumOperands() > 1) {
709        llvm::Value *ExportVarNameMDS = ExportVar->getOperand(0);
710        if (ExportVarNameMDS->getValueID() == llvm::Value::MDStringVal) {
711          llvm::StringRef ExportVarName =
712            static_cast<llvm::MDString*>(ExportVarNameMDS)->getString();
713
714          CodeEmitter::global_addresses_const_iterator I, E;
715          for (I = mCodeEmitter->global_address_begin(),
716               E = mCodeEmitter->global_address_end();
717               I != E; I++) {
718            if (I->first->getValueID() != llvm::Value::GlobalVariableVal)
719              continue;
720            if (ExportVarName == I->first->getName()) {
721              varList.push_back(I->second);
722#if DEBUG_BCC_REFLECT
723              ALOGD("runCodeGen(): Exported VAR: %s @ %p\n", ExportVarName.str().c_str(), I->second);
724#endif
725              break;
726            }
727          }
728          if (I != mCodeEmitter->global_address_end())
729            continue;  // found
730
731#if DEBUG_BCC_REFLECT
732          ALOGD("runCodeGen(): Exported VAR: %s @ %p\n",
733               ExportVarName.str().c_str(), (void *)0);
734#endif
735        }
736      }
737      // if reaching here, we know the global variable record in metadata is
738      // not found. So we make an empty slot
739      varList.push_back(NULL);
740    }
741
742    bccAssert((varList.size() == ExportVarMetadata->getNumOperands()) &&
743              "Number of slots doesn't match the number of export variables!");
744  }
745
746  if (ExportFuncMetadata) {
747    ScriptCompiled::ExportFuncList &funcList = mpResult->mExportFuncs;
748
749    for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) {
750      llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i);
751      if (ExportFunc != NULL && ExportFunc->getNumOperands() > 0) {
752        llvm::Value *ExportFuncNameMDS = ExportFunc->getOperand(0);
753        if (ExportFuncNameMDS->getValueID() == llvm::Value::MDStringVal) {
754          llvm::StringRef ExportFuncName =
755            static_cast<llvm::MDString*>(ExportFuncNameMDS)->getString();
756          funcList.push_back(mpResult->lookup(ExportFuncName.str().c_str()));
757#if DEBUG_BCC_REFLECT
758          ALOGD("runCodeGen(): Exported Func: %s @ %p\n", ExportFuncName.str().c_str(),
759               funcList.back());
760#endif
761        }
762      }
763    }
764  }
765
766  // Tell code emitter now can release the memory using during the JIT since
767  // we have done the code emission
768  mCodeEmitter->releaseUnnecessary();
769
770  return 0;
771}
772#endif // USE_OLD_JIT
773
774
775#if USE_MCJIT
776int Compiler::runMCCodeGen(llvm::TargetData *TD, llvm::TargetMachine *TM) {
777  // Decorate mEmittedELFExecutable with formatted ostream
778  llvm::raw_svector_ostream OutSVOS(mEmittedELFExecutable);
779
780  // Relax all machine instructions
781  TM->setMCRelaxAll(/* RelaxAll= */ true);
782
783  // Create MC code generation pass manager
784  llvm::PassManager MCCodeGenPasses;
785
786  // Add TargetData to MC code generation pass manager
787  MCCodeGenPasses.add(TD);
788
789  // Add MC code generation passes to pass manager
790  llvm::MCContext *Ctx = NULL;
791  if (TM->addPassesToEmitMC(MCCodeGenPasses, Ctx, OutSVOS, false)) {
792    setError("Fail to add passes to emit file");
793    return 1;
794  }
795
796  MCCodeGenPasses.run(*mModule);
797  OutSVOS.flush();
798  return 0;
799}
800#endif // USE_MCJIT
801
802int Compiler::runInternalPasses(std::vector<std::string>& Names,
803                                std::vector<uint32_t>& Signatures) {
804  llvm::PassManager BCCPasses;
805
806  // Expand ForEach on CPU path to reduce launch overhead.
807  BCCPasses.add(createForEachExpandPass(Names, Signatures));
808
809  BCCPasses.run(*mModule);
810
811  return 0;
812}
813
814int Compiler::runLTO(llvm::TargetData *TD,
815                     llvm::NamedMDNode const *ExportVarMetadata,
816                     llvm::NamedMDNode const *ExportFuncMetadata,
817                     std::vector<std::string>& ForEachExpandList,
818                     llvm::CodeGenOpt::Level OptimizationLevel) {
819  // Collect All Exported Symbols
820  std::vector<const char*> ExportSymbols;
821
822  // Note: This is a workaround for getting export variable and function name.
823  // We should refine it soon.
824  if (ExportVarMetadata) {
825    for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) {
826      llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i);
827      if (ExportVar != NULL && ExportVar->getNumOperands() > 1) {
828        llvm::Value *ExportVarNameMDS = ExportVar->getOperand(0);
829        if (ExportVarNameMDS->getValueID() == llvm::Value::MDStringVal) {
830          llvm::StringRef ExportVarName =
831            static_cast<llvm::MDString*>(ExportVarNameMDS)->getString();
832          ExportSymbols.push_back(ExportVarName.data());
833        }
834      }
835    }
836  }
837
838  if (ExportFuncMetadata) {
839    for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) {
840      llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i);
841      if (ExportFunc != NULL && ExportFunc->getNumOperands() > 0) {
842        llvm::Value *ExportFuncNameMDS = ExportFunc->getOperand(0);
843        if (ExportFuncNameMDS->getValueID() == llvm::Value::MDStringVal) {
844          llvm::StringRef ExportFuncName =
845            static_cast<llvm::MDString*>(ExportFuncNameMDS)->getString();
846          ExportSymbols.push_back(ExportFuncName.data());
847        }
848      }
849    }
850  }
851
852  for (int i = 0, e = ForEachExpandList.size(); i != e; i++) {
853    ExportSymbols.push_back(ForEachExpandList[i].c_str());
854  }
855
856  // TODO(logan): Remove this after we have finished the
857  // bccMarkExternalSymbol API.
858
859  // root(), init(), and .rs.dtor() are born to be exported
860  ExportSymbols.push_back("root");
861  ExportSymbols.push_back("init");
862  ExportSymbols.push_back(".rs.dtor");
863
864  // User-defined exporting symbols
865  std::vector<char const *> const &UserDefinedExternalSymbols =
866    mpResult->getUserDefinedExternalSymbols();
867
868  std::copy(UserDefinedExternalSymbols.begin(),
869            UserDefinedExternalSymbols.end(),
870            std::back_inserter(ExportSymbols));
871
872  llvm::PassManager LTOPasses;
873
874  // Add TargetData to LTO passes
875  LTOPasses.add(TD);
876
877  // We now create passes list performing LTO. These are copied from
878  // (including comments) llvm::createStandardLTOPasses().
879  // Only a subset of these LTO passes are enabled in optimization level 0
880  // as they interfere with interactive debugging.
881  // FIXME: figure out which passes (if any) makes sense for levels 1 and 2
882
883  if (OptimizationLevel != llvm::CodeGenOpt::None) {
884    // Internalize all other symbols not listed in ExportSymbols
885    LTOPasses.add(llvm::createInternalizePass(ExportSymbols));
886
887    // Propagate constants at call sites into the functions they call. This
888    // opens opportunities for globalopt (and inlining) by substituting
889    // function pointers passed as arguments to direct uses of functions.
890    LTOPasses.add(llvm::createIPSCCPPass());
891
892    // Now that we internalized some globals, see if we can hack on them!
893    LTOPasses.add(llvm::createGlobalOptimizerPass());
894
895    // Linking modules together can lead to duplicated global constants, only
896    // keep one copy of each constant...
897    LTOPasses.add(llvm::createConstantMergePass());
898
899    // Remove unused arguments from functions...
900    LTOPasses.add(llvm::createDeadArgEliminationPass());
901
902    // Reduce the code after globalopt and ipsccp. Both can open up
903    // significant simplification opportunities, and both can propagate
904    // functions through function pointers. When this happens, we often have
905    // to resolve varargs calls, etc, so let instcombine do this.
906    LTOPasses.add(llvm::createInstructionCombiningPass());
907
908    // Inline small functions
909    LTOPasses.add(llvm::createFunctionInliningPass());
910
911    // Remove dead EH info.
912    LTOPasses.add(llvm::createPruneEHPass());
913
914    // Internalize the globals again after inlining
915    LTOPasses.add(llvm::createGlobalOptimizerPass());
916
917    // Remove dead functions.
918    LTOPasses.add(llvm::createGlobalDCEPass());
919
920    // If we didn't decide to inline a function, check to see if we can
921    // transform it to pass arguments by value instead of by reference.
922    LTOPasses.add(llvm::createArgumentPromotionPass());
923
924    // The IPO passes may leave cruft around.  Clean up after them.
925    LTOPasses.add(llvm::createInstructionCombiningPass());
926    LTOPasses.add(llvm::createJumpThreadingPass());
927
928    // Break up allocas
929    LTOPasses.add(llvm::createScalarReplAggregatesPass());
930
931    // Run a few AA driven optimizations here and now, to cleanup the code.
932    LTOPasses.add(llvm::createFunctionAttrsPass());  // Add nocapture.
933    LTOPasses.add(llvm::createGlobalsModRefPass());  // IP alias analysis.
934
935    // Hoist loop invariants.
936    LTOPasses.add(llvm::createLICMPass());
937
938    // Remove redundancies.
939    LTOPasses.add(llvm::createGVNPass());
940
941    // Remove dead memcpys.
942    LTOPasses.add(llvm::createMemCpyOptPass());
943
944    // Nuke dead stores.
945    LTOPasses.add(llvm::createDeadStoreEliminationPass());
946
947    // Cleanup and simplify the code after the scalar optimizations.
948    LTOPasses.add(llvm::createInstructionCombiningPass());
949
950    LTOPasses.add(llvm::createJumpThreadingPass());
951
952    // Delete basic blocks, which optimization passes may have killed.
953    LTOPasses.add(llvm::createCFGSimplificationPass());
954
955    // Now that we have optimized the program, discard unreachable functions.
956    LTOPasses.add(llvm::createGlobalDCEPass());
957
958  } else {
959    LTOPasses.add(llvm::createInternalizePass(ExportSymbols));
960    LTOPasses.add(llvm::createGlobalOptimizerPass());
961    LTOPasses.add(llvm::createConstantMergePass());
962  }
963
964  LTOPasses.run(*mModule);
965
966#if ANDROID_ENGINEERING_BUILD
967  if (0 != gDebugDumpDirectory) {
968    std::string errs;
969    std::string Filename(gDebugDumpDirectory);
970    Filename += "/post-lto-module.ll";
971    llvm::raw_fd_ostream FS(Filename.c_str(), errs);
972    mModule->print(FS, 0);
973    FS.close();
974  }
975#endif
976
977  return 0;
978}
979
980
981#if USE_MCJIT
982void *Compiler::getSymbolAddress(char const *name) {
983  return rsloaderGetSymbolAddress(mRSExecutable, name);
984}
985#endif
986
987
988#if USE_MCJIT
989void *Compiler::resolveSymbolAdapter(void *context, char const *name) {
990  Compiler *self = reinterpret_cast<Compiler *>(context);
991
992  if (void *Addr = FindRuntimeFunction(name)) {
993    return Addr;
994  }
995
996  if (self->mpSymbolLookupFn) {
997    if (void *Addr = self->mpSymbolLookupFn(self->mpSymbolLookupContext, name)) {
998      return Addr;
999    }
1000  }
1001
1002  ALOGE("Unable to resolve symbol: %s\n", name);
1003  return NULL;
1004}
1005#endif
1006
1007
1008Compiler::~Compiler() {
1009#if USE_MCJIT
1010  rsloaderDisposeExec(mRSExecutable);
1011#endif
1012
1013  // llvm::llvm_shutdown();
1014}
1015
1016
1017}  // namespace bcc
1018