slang_rs_export_var.cpp revision e639eb5caa2c386b4a60659a4929e8a6141a2cbe
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_var.h"
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/AST/Type.h"
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
21e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/ADT/APSInt.h"
22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
236315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_context.h"
246315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_rs_export_type.h"
256315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang {
27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
289ef2f785e0cc490af678dfd685995dec787321ffShih-wei LiaoRSExportVar::RSExportVar(RSContext *Context,
299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                         const clang::VarDecl *VD,
306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr                         const RSExportType *ET)
31a41ce1d98094da84643995d40d71c529905123fcZonr Chang    : RSExportable(Context, RSExportable::EX_VAR),
326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mName(VD->getName().data(), VD->getName().size()),
336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mET(ET),
346315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      mIsConst(false) {
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // mInit - Evaluate initializer expression
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const clang::Expr *Initializer = VD->getAnyInitializer();
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (Initializer != NULL) {
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    switch (ET->getClass()) {
39324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao      case RSExportType::ExportClassPrimitive:
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      case RSExportType::ExportClassVector: {
419e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines        Initializer->Evaluate(mInit, Context->getASTContext());
42324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        break;
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      case RSExportType::ExportClassPointer: {
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        if (Initializer->isNullPointerConstant
469e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines            (Context->getASTContext(),
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao             clang::Expr::NPC_ValueDependentIsNotNull)
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao            )
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao          mInit.Val = clang::APValue(llvm::APSInt(1));
50324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        else
519e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines          Initializer->Evaluate(mInit, Context->getASTContext());
52324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        break;
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      case RSExportType::ExportClassRecord: {
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        // No action
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        fprintf(stderr, "RSExportVar::RSExportVar : Reflection of initializer "
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        "to variable '%s' (of type '%s') is unsupported "
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                        "currently.\n",
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                mName.c_str(),
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                ET->getName().c_str());
61324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        break;
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      default: {
64324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao        assert(false && "Unknown class of type");
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      }
66324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao    }
6781c1b4865e9c8fd655ea4528814f6c53e225ba6dShih-wei Liao  }
6881c1b4865e9c8fd655ea4528814f6c53e225ba6dShih-wei Liao
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // mIsConst - Is it a constant?
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  clang::QualType QT = VD->getTypeSourceInfo()->getType();
7181c1b4865e9c8fd655ea4528814f6c53e225ba6dShih-wei Liao  if (!QT.isNull()) {
7281c1b4865e9c8fd655ea4528814f6c53e225ba6dShih-wei Liao    mIsConst = QT.isConstQualified();
7381c1b4865e9c8fd655ea4528814f6c53e225ba6dShih-wei Liao  }
749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
75324c0479ec3edda573de60b2e6476507a99d06f7Shih-wei Liao  return;
76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
77e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
78e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines}  // namespace slang
79