11c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang/*
21c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang * Copyright 2012, The Android Open Source Project
31c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang *
41c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
51c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang * you may not use this file except in compliance with the License.
61c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang * You may obtain a copy of the License at
71c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang *
81c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
91c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang *
101c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang * Unless required by applicable law or agreed to in writing, software
111c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
121c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang * See the License for the specific language governing permissions and
141c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang * limitations under the License.
151c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang */
161c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
17c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/BCCContext.h"
181c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
191c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang#include <new>
201c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
21c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang#include "bcc/Source.h"
22ef73a242762bcd8113b9b65ceccbe7d909b5acbcZonr Chang#include "bcc/Support/Log.h"
23c72c4ddfcd79c74f70713da91a69569451b5c19eZonr Chang
241c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang#include "BCCContextImpl.h"
251c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
261c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Changusing namespace bcc;
271c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
281c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Changstatic BCCContext *GlobalContext = NULL;
291c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
301c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr ChangBCCContext *BCCContext::GetOrCreateGlobalContext() {
311c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang  if (GlobalContext == NULL) {
321c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang    GlobalContext = new (std::nothrow) BCCContext();
331c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang    if (GlobalContext == NULL) {
341c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang      ALOGE("Out of memory when allocating global BCCContext!");
351c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang    }
361c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang  }
371c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang  return GlobalContext;
381c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang}
391c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
401c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Changvoid BCCContext::DestroyGlobalContext() {
411c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang  delete GlobalContext;
421c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang  GlobalContext = NULL;
431c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang}
441c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
45ade92778b99382413ff9c556c724dd3f447e5dfbZonr ChangBCCContext::BCCContext() : mImpl(new BCCContextImpl(*this)) { }
461c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
471c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr ChangBCCContext::~BCCContext() {
481c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang  delete mImpl;
491c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang  if (this == GlobalContext) {
501c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang    // We're deleting the context returned from GetOrCreateGlobalContext().
511c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang    // Reset the GlobalContext.
521c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang    GlobalContext = NULL;
531c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang  }
541c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang}
551c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
56d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaovoid BCCContext::addSource(Source &pSource)
57d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao{ mImpl->mOwnSources.insert(&pSource); }
58d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
59d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liaovoid BCCContext::removeSource(Source &pSource)
60d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao{ mImpl->mOwnSources.erase(&pSource); }
61d2a5a0eab7a1273797029702652e50b2ed9e6a6dShih-wei Liao
621c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Changllvm::LLVMContext &BCCContext::getLLVMContext()
631c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang{ return mImpl->mLLVMContext; }
641c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang
651c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Changconst llvm::LLVMContext &BCCContext::getLLVMContext() const
661c30cee77f9a148215a0dacee2d922d1ec1b3baeZonr Chang{ return mImpl->mLLVMContext; }
67