mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Implement review feedback. Aliasees can be either GlobalValue's or
bitcasts of them. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36537 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -179,6 +179,27 @@ public: | ||||
|  | ||||
|   } | ||||
|  | ||||
|   virtual void handleGlobalAlias( | ||||
|     const Type* ElemType, | ||||
|     GlobalValue::LinkageTypes Linkage, | ||||
|     unsigned TypeSlotNum, | ||||
|     unsigned AliaseeSlot) { | ||||
|     if (os) { | ||||
|       *os << "      GA: " | ||||
|           << " Linkage=" << Linkage | ||||
|           << " Type="; | ||||
|       //WriteTypeSymbolic(*os, ElemType, M); | ||||
|       *os << " Slot=" << TypeSlotNum << " AliaseeSlot=" << AliaseeSlot | ||||
|           << "\n"; | ||||
|     } | ||||
|  | ||||
|     bca.numValues++; | ||||
|     if (TypeSlotNum > bca.maxValueSlot) | ||||
|       bca.maxValueSlot = TypeSlotNum; | ||||
|     if (AliaseeSlot > bca.maxValueSlot) | ||||
|       bca.maxValueSlot = AliaseeSlot; | ||||
|   } | ||||
|  | ||||
|   virtual void handleTypeList(unsigned numEntries) { | ||||
|     bca.maxTypeSlot = numEntries - 1; | ||||
|   } | ||||
|   | ||||
| @@ -1923,12 +1923,10 @@ void BytecodeReader::ParseModuleGlobalInfo() { | ||||
|     // Read aliases... | ||||
|     unsigned VarType = read_vbr_uint(); | ||||
|     while (VarType != Type::VoidTyID) { // List is terminated by Void | ||||
|       unsigned TypeSlotNo = VarType >> 2; | ||||
|       unsigned TypeSlotNo     = VarType >> 3; | ||||
|       unsigned EncodedLinkage = VarType & 3; | ||||
|       unsigned AliaseeTypeSlotNo, AliaseeSlotNo; | ||||
|  | ||||
|       AliaseeTypeSlotNo = read_vbr_uint(); | ||||
|       AliaseeSlotNo = read_vbr_uint(); | ||||
|       bool isConstantAliasee  = (VarType >> 2) & 1; | ||||
|       unsigned AliaseeSlotNo  = read_vbr_uint(); | ||||
|  | ||||
|       const Type *Ty = getType(TypeSlotNo); | ||||
|       if (!Ty) | ||||
| @@ -1937,11 +1935,11 @@ void BytecodeReader::ParseModuleGlobalInfo() { | ||||
|       if (!isa<PointerType>(Ty)) | ||||
|         error("Alias not a pointer type! Ty= " + Ty->getDescription()); | ||||
|        | ||||
|       Value* V = getValue(AliaseeTypeSlotNo, AliaseeSlotNo, false); | ||||
|       if (!V) | ||||
|         error("Invalid aliasee! TypeSlotNo=" + utostr(AliaseeTypeSlotNo) + | ||||
|       Value* V = getValue(TypeSlotNo, AliaseeSlotNo, false); | ||||
|       if (!V && !isConstantAliasee) | ||||
|         error("Invalid aliasee! TypeSlotNo=" + utostr(TypeSlotNo) + | ||||
|               " SlotNo=" + utostr(AliaseeSlotNo)); | ||||
|       if (!isa<GlobalValue>(V)) | ||||
|       if (!isConstantAliasee && !isa<GlobalValue>(V)) | ||||
|         error("Aliasee is not global value! SlotNo=" + utostr(AliaseeSlotNo)); | ||||
|  | ||||
|       GlobalValue::LinkageTypes Linkage; | ||||
| @@ -1960,8 +1958,14 @@ void BytecodeReader::ParseModuleGlobalInfo() { | ||||
|       } | ||||
|        | ||||
|       GlobalAlias *GA = new GlobalAlias(Ty, Linkage, "", | ||||
|                                         dyn_cast<GlobalValue>(V), TheModule); | ||||
|                                         dyn_cast_or_null<Constant>(V), | ||||
|                                         TheModule); | ||||
|       insertValue(GA, TypeSlotNo, ModuleValues); | ||||
|       if (!V && isConstantAliasee) | ||||
|         Aliasees.push_back(std::make_pair(GA, AliaseeSlotNo)); | ||||
|  | ||||
|       if (Handler) Handler->handleGlobalAlias(Ty, Linkage, | ||||
|                                               TypeSlotNo, AliaseeSlotNo); | ||||
|       VarType = read_vbr_uint(); | ||||
|     } | ||||
|   }   | ||||
| @@ -2068,6 +2072,23 @@ void BytecodeReader::ParseModule() { | ||||
|       error("Cannot find initializer value."); | ||||
|   } | ||||
|  | ||||
|   // And aliasees | ||||
|   while (!Aliasees.empty()) { | ||||
|     GlobalAlias *GA = Aliasees.back().first; | ||||
|     unsigned Slot = Aliasees.back().second; | ||||
|     Aliasees.pop_back(); | ||||
|  | ||||
|     // Look up the aliasee value... | ||||
|     const llvm::PointerType* GAType = GA->getType(); | ||||
|     unsigned TypeSlot = getTypeSlot(GAType); | ||||
|     if (Constant *CV = getConstantValue(TypeSlot, Slot)) { | ||||
|       if (GA->getAliasee()) | ||||
|         error("Aliasee was *already* set?!"); | ||||
|       GA->setAliasee(CV); | ||||
|     } else | ||||
|       error("Cannot find aliasee value."); | ||||
|   } | ||||
|  | ||||
|   if (!ConstantFwdRefs.empty()) | ||||
|     error("Use of undefined constants in a module"); | ||||
|  | ||||
|   | ||||
| @@ -129,6 +129,9 @@ public: | ||||
|   /// them. | ||||
|   typedef std::vector<std::pair<GlobalVariable*, unsigned> > GlobalInitsList; | ||||
|  | ||||
|   /// @brief A list of global aliases and the slot number for constant aliasees | ||||
|   typedef std::vector<std::pair<GlobalAlias*, unsigned> > AliaseeList; | ||||
|  | ||||
|   /// This type maps a typeslot/valueslot pair to the corresponding Value*. | ||||
|   /// It is used for dealing with forward references as values are read in. | ||||
|   /// @brief A map for dealing with forward references of values. | ||||
| @@ -338,6 +341,12 @@ private: | ||||
|   /// of what we must do. | ||||
|   GlobalInitsList GlobalInits; | ||||
|  | ||||
|   /// Constant values are read in after global aliases. Because of this, we must | ||||
|   /// defer setting the constant aliasees until after module level constants | ||||
|   /// have been read. In the mean time, this list keeps track of what we must | ||||
|   /// do. | ||||
|   AliaseeList Aliasees; | ||||
|    | ||||
|   // For lazy reading-in of functions, we need to save away several pieces of | ||||
|   // information about each function: its begin and end pointer in the buffer | ||||
|   // and its FunctionSlot. | ||||
|   | ||||
| @@ -89,6 +89,12 @@ void SlotCalculator::processModule() { | ||||
|        I != E; ++I) | ||||
|     CreateSlotIfNeeded(I); | ||||
|  | ||||
|   // Add all of the global aliases to the value table... | ||||
|   // | ||||
|   for (Module::const_alias_iterator I = TheModule->alias_begin(), | ||||
|          E = TheModule->alias_end(); I != E; ++I) | ||||
|     CreateSlotIfNeeded(I); | ||||
|  | ||||
|   // Add all of the module level constants used as initializers | ||||
|   // | ||||
|   for (Module::const_global_iterator I = TheModule->global_begin(), | ||||
| @@ -96,6 +102,13 @@ void SlotCalculator::processModule() { | ||||
|     if (I->hasInitializer()) | ||||
|       CreateSlotIfNeeded(I->getInitializer()); | ||||
|  | ||||
|   // Add all of the module level constants used as aliasees | ||||
|   // | ||||
|   for (Module::const_alias_iterator I = TheModule->alias_begin(), | ||||
|          E = TheModule->alias_end(); I != E; ++I) | ||||
|     if (I->getAliasee()) | ||||
|       CreateSlotIfNeeded(I->getAliasee()); | ||||
|  | ||||
|   // Now that all global constants have been added, rearrange constant planes | ||||
|   // that contain constant strings so that the strings occur at the start of the | ||||
|   // plane, not somewhere in the middle. | ||||
|   | ||||
| @@ -1095,9 +1095,11 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) { | ||||
|   // Output aliases | ||||
|   for (Module::const_alias_iterator I = M->alias_begin(), E = M->alias_end(); | ||||
|        I != E; ++I) { | ||||
|     unsigned Slot = Table.getTypeSlot(I->getType()); | ||||
|     assert(((Slot << 2) >> 2) == Slot && "Slot # too big!"); | ||||
|     unsigned TypeSlotNo    = Table.getTypeSlot(I->getType()); | ||||
|     unsigned AliaseeSlotNo = Table.getSlot(I->getAliasee()); | ||||
|     assert(((TypeSlotNo << 3) >> 3) == TypeSlotNo && "Slot # too big!"); | ||||
|     unsigned aliasLinkage = 0; | ||||
|     unsigned isConstantAliasee = ((!isa<GlobalValue>(I->getAliasee())) << 2); | ||||
|     switch (I->getLinkage()) { | ||||
|      case GlobalValue::ExternalLinkage: | ||||
|       aliasLinkage = 0; | ||||
| @@ -1111,9 +1113,8 @@ void BytecodeWriter::outputModuleInfoBlock(const Module *M) { | ||||
|      default: | ||||
|       assert(0 && "Invalid alias linkage"); | ||||
|     }     | ||||
|     output_vbr((Slot << 2) | aliasLinkage); | ||||
|     output_vbr(Table.getTypeSlot(I->getAliasee()->getType())); | ||||
|     output_vbr(Table.getSlot(I->getAliasee())); | ||||
|     output_vbr((TypeSlotNo << 3) | isConstantAliasee | aliasLinkage); | ||||
|     output_vbr(AliaseeSlotNo); | ||||
|   } | ||||
|   output_typeid(Table.getTypeSlot(Type::VoidTy)); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user