Home | History | Annotate | Download | only in llvm
      1 /*
      2  * Copyright (C) 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 
     18 #include "md_builder.h"
     19 
     20 #include "llvm/IR/MDBuilder.h"
     21 
     22 #include <string>
     23 
     24 namespace art {
     25 namespace llvm {
     26 
     27 
     28 ::llvm::MDNode* MDBuilder::GetTBAASpecialType(TBAASpecialType sty_id) {
     29   DCHECK_GE(sty_id, 0) << "Unknown TBAA special type: " << sty_id;
     30   DCHECK_LT(sty_id, MAX_TBAA_SPECIAL_TYPE) << "Unknown TBAA special type: " << sty_id;
     31   DCHECK(tbaa_root_ != NULL);
     32 
     33   ::llvm::MDNode*& spec_ty = tbaa_special_type_[sty_id];
     34   if (spec_ty == NULL) {
     35     switch (sty_id) {
     36     case kTBAARegister:
     37       spec_ty = createTBAANode("Register", tbaa_root_);
     38       break;
     39     case kTBAAStackTemp:
     40       spec_ty = createTBAANode("StackTemp", tbaa_root_);
     41       break;
     42     case kTBAAHeapArray:
     43       spec_ty = createTBAANode("HeapArray", tbaa_root_);
     44       break;
     45     case kTBAAHeapInstance:
     46       spec_ty = createTBAANode("HeapInstance", tbaa_root_);
     47       break;
     48     case kTBAAHeapStatic:
     49       spec_ty = createTBAANode("HeapStatic", tbaa_root_);
     50       break;
     51     case kTBAAJRuntime:
     52       spec_ty = createTBAANode("JRuntime", tbaa_root_);
     53       break;
     54     case kTBAARuntimeInfo:
     55       spec_ty = createTBAANode("RuntimeInfo", GetTBAASpecialType(kTBAAJRuntime));
     56       break;
     57     case kTBAAShadowFrame:
     58       spec_ty = createTBAANode("ShadowFrame", GetTBAASpecialType(kTBAAJRuntime));
     59       break;
     60     case kTBAAConstJObject:
     61       spec_ty = createTBAANode("ConstJObject", tbaa_root_, true);
     62       break;
     63     default:
     64       LOG(FATAL) << "Unknown TBAA special type: " << sty_id;
     65       break;
     66     }
     67   }
     68   return spec_ty;
     69 }
     70 
     71 ::llvm::MDNode* MDBuilder::GetTBAAMemoryJType(TBAASpecialType sty_id, JType jty_id) {
     72   DCHECK(sty_id == kTBAAHeapArray ||
     73          sty_id == kTBAAHeapInstance ||
     74          sty_id == kTBAAHeapStatic) << "SpecialType must be array, instance, or static";
     75 
     76   DCHECK_GE(jty_id, 0) << "Unknown JType: " << jty_id;
     77   DCHECK_LT(jty_id, MAX_JTYPE) << "Unknown JType: " << jty_id;
     78   DCHECK_NE(jty_id, kVoid) << "Can't load/store Void type!";
     79 
     80   std::string name;
     81   size_t sty_mapped_index = 0;
     82   switch (sty_id) {
     83   case kTBAAHeapArray:    sty_mapped_index = 0; name = "HeapArray "; break;
     84   case kTBAAHeapInstance: sty_mapped_index = 1; name = "HeapInstance "; break;
     85   case kTBAAHeapStatic:   sty_mapped_index = 2; name = "HeapStatic "; break;
     86   default:
     87     LOG(FATAL) << "Unknown TBAA special type: " << sty_id;
     88     break;
     89   }
     90 
     91   ::llvm::MDNode*& spec_ty = tbaa_memory_jtype_[sty_mapped_index][jty_id];
     92   if (spec_ty != NULL) {
     93     return spec_ty;
     94   }
     95 
     96   switch (jty_id) {
     97   case kBoolean: name += "Boolean"; break;
     98   case kByte:    name += "Byte"; break;
     99   case kChar:    name += "Char"; break;
    100   case kShort:   name += "Short"; break;
    101   case kInt:     name += "Int"; break;
    102   case kLong:    name += "Long"; break;
    103   case kFloat:   name += "Float"; break;
    104   case kDouble:  name += "Double"; break;
    105   case kObject:  name += "Object"; break;
    106   default:
    107     LOG(FATAL) << "Unknown JType: " << jty_id;
    108     break;
    109   }
    110 
    111   spec_ty = createTBAANode(name, GetTBAASpecialType(sty_id));
    112   return spec_ty;
    113 }
    114 
    115 
    116 }  // namespace llvm
    117 }  // namespace art
    118