|  | //===- Memory.cpp ---------------------------------------------------------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "lld/Common/Memory.h" | 
|  | #include "lld/Common/CommonLinkerContext.h" | 
|  |  | 
|  | using namespace llvm; | 
|  | using namespace lld; | 
|  |  | 
|  | SpecificAllocBase * | 
|  | lld::SpecificAllocBase::getOrCreate(void *tag, size_t size, size_t align, | 
|  | SpecificAllocBase *(&creator)(void *)) { | 
|  | auto &instances = context().instances; | 
|  | auto &instance = instances[tag]; | 
|  | if (instance == nullptr) { | 
|  | void *storage = context().bAlloc.Allocate(size, align); | 
|  | instance = creator(storage); | 
|  | } | 
|  | return instance; | 
|  | } |