brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · cced319 Raw
83 lines · cpp
1//===- ValueList.cpp - Internal BitcodeReader implementation --------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "ValueList.h"10#include "llvm/IR/Argument.h"11#include "llvm/IR/Constant.h"12#include "llvm/IR/GlobalValue.h"13#include "llvm/IR/Instruction.h"14#include "llvm/IR/Type.h"15#include "llvm/IR/Value.h"16#include "llvm/Support/Casting.h"17#include "llvm/Support/Error.h"18 19using namespace llvm;20 21Error BitcodeReaderValueList::assignValue(unsigned Idx, Value *V,22                                          unsigned TypeID) {23  if (Idx == size()) {24    push_back(V, TypeID);25    return Error::success();26  }27 28  if (Idx >= size())29    resize(Idx + 1);30 31  auto &Old = ValuePtrs[Idx];32  if (!Old.first) {33    Old.first = V;34    Old.second = TypeID;35    return Error::success();36  }37 38  assert(!isa<Constant>(&*Old.first) && "Shouldn't update constant");39  // If there was a forward reference to this value, replace it.40  Value *PrevVal = Old.first;41  if (PrevVal->getType() != V->getType())42    return createStringError(43        std::errc::illegal_byte_sequence,44        "Assigned value does not match type of forward declaration");45  Old.first->replaceAllUsesWith(V);46  PrevVal->deleteValue();47  return Error::success();48}49 50Value *BitcodeReaderValueList::getValueFwdRef(unsigned Idx, Type *Ty,51                                              unsigned TyID,52                                              BasicBlock *ConstExprInsertBB) {53  // Bail out for a clearly invalid value.54  if (Idx >= RefsUpperBound)55    return nullptr;56 57  if (Idx >= size())58    resize(Idx + 1);59 60  if (Value *V = ValuePtrs[Idx].first) {61    // If the types don't match, it's invalid.62    if (Ty && Ty != V->getType())63      return nullptr;64 65    Expected<Value *> MaybeV = MaterializeValueFn(Idx, ConstExprInsertBB);66    if (!MaybeV) {67      // TODO: We might want to propagate the precise error message here.68      consumeError(MaybeV.takeError());69      return nullptr;70    }71    return MaybeV.get();72  }73 74  // No type specified, must be invalid reference.75  if (!Ty)76    return nullptr;77 78  // Create and return a placeholder, which will later be RAUW'd.79  Value *V = new Argument(Ty);80  ValuePtrs[Idx] = {V, TyID};81  return V;82}83