mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	Fixup for r167558: Store raw pointer (instead of reference) to RelocMap in DIContext. This is needed to prevent crashes because of dangling reference if the clients don't provide RelocMap to DIContext constructor.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167728 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -109,7 +109,7 @@ public: | ||||
|                                     StringRef lineSection = StringRef(), | ||||
|                                     StringRef stringSection = StringRef(), | ||||
|                                     StringRef rangeSection = StringRef(), | ||||
|                                     const RelocAddrMap &Map = RelocAddrMap()); | ||||
|                                     const RelocAddrMap *Map = 0); | ||||
|  | ||||
|   virtual void dump(raw_ostream &OS) = 0; | ||||
|  | ||||
|   | ||||
| @@ -20,7 +20,7 @@ DIContext *DIContext::getDWARFContext(bool isLittleEndian, | ||||
|                                       StringRef lineSection, | ||||
|                                       StringRef stringSection, | ||||
|                                       StringRef rangeSection, | ||||
|                                       const RelocAddrMap &Map) { | ||||
|                                       const RelocAddrMap *Map) { | ||||
|   return new DWARFContextInMemory(isLittleEndian, infoSection, abbrevSection, | ||||
|                                   aRangeSection, lineSection, stringSection, | ||||
|                                   rangeSection, Map); | ||||
|   | ||||
| @@ -26,7 +26,7 @@ namespace llvm { | ||||
| /// methods that a concrete implementation provides. | ||||
| class DWARFContext : public DIContext { | ||||
|   bool IsLittleEndian; | ||||
|   const RelocAddrMap &RelocMap; | ||||
|   const RelocAddrMap *RelocMap; | ||||
|  | ||||
|   SmallVector<DWARFCompileUnit, 1> CUs; | ||||
|   OwningPtr<DWARFDebugAbbrev> Abbrev; | ||||
| @@ -39,7 +39,7 @@ class DWARFContext : public DIContext { | ||||
|   /// Read compile units from the debug_info section and store them in CUs. | ||||
|   void parseCompileUnits(); | ||||
| protected: | ||||
|   DWARFContext(bool isLittleEndian, const RelocAddrMap &Map) : | ||||
|   DWARFContext(bool isLittleEndian, const RelocAddrMap *Map) : | ||||
|     IsLittleEndian(isLittleEndian), RelocMap(Map) {} | ||||
| public: | ||||
|   virtual void dump(raw_ostream &OS); | ||||
| @@ -73,7 +73,7 @@ public: | ||||
|       DILineInfoSpecifier Specifier = DILineInfoSpecifier()); | ||||
|  | ||||
|   bool isLittleEndian() const { return IsLittleEndian; } | ||||
|   const RelocAddrMap &relocMap() const { return RelocMap; } | ||||
|   const RelocAddrMap *relocMap() const { return RelocMap; } | ||||
|  | ||||
|   virtual StringRef getInfoSection() = 0; | ||||
|   virtual StringRef getAbbrevSection() = 0; | ||||
| @@ -113,7 +113,7 @@ public: | ||||
|                        StringRef lineSection, | ||||
|                        StringRef stringSection, | ||||
|                        StringRef rangeSection, | ||||
|                        const RelocAddrMap &Map = RelocAddrMap()) | ||||
|                        const RelocAddrMap *Map = 0) | ||||
|     : DWARFContext(isLittleEndian, Map), | ||||
|       InfoSection(infoSection), | ||||
|       AbbrevSection(abbrevSection), | ||||
|   | ||||
| @@ -100,16 +100,20 @@ DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr, | ||||
|     switch (Form) { | ||||
|     case DW_FORM_addr: | ||||
|     case DW_FORM_ref_addr: { | ||||
|       RelocAddrMap::const_iterator AI | ||||
|         = cu->getContext().relocMap().find(*offset_ptr); | ||||
|       if (AI != cu->getContext().relocMap().end()) { | ||||
|       bool InRelocMap = false; | ||||
|       if (const RelocAddrMap *RelocMap = cu->getContext().relocMap()) { | ||||
|         RelocAddrMap::const_iterator AI = RelocMap->find(*offset_ptr); | ||||
|         if (AI != RelocMap->end()) { | ||||
|           const std::pair<uint8_t, int64_t> &R = AI->second; | ||||
|           Value.uval = R.second; | ||||
|           *offset_ptr += R.first; | ||||
|       } else | ||||
|         Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize()); | ||||
|           InRelocMap = true; | ||||
|         } | ||||
|       } | ||||
|       if (!InRelocMap) | ||||
|         Value.uval = data.getUnsigned(offset_ptr, cu->getAddressByteSize()); | ||||
|       break; | ||||
|     } | ||||
|     case DW_FORM_exprloc: | ||||
|     case DW_FORM_block: | ||||
|       Value.uval = data.getULEB128(offset_ptr); | ||||
| @@ -148,13 +152,17 @@ DWARFFormValue::extractValue(DataExtractor data, uint32_t *offset_ptr, | ||||
|       Value.sval = data.getSLEB128(offset_ptr); | ||||
|       break; | ||||
|     case DW_FORM_strp: { | ||||
|       RelocAddrMap::const_iterator AI | ||||
|         = cu->getContext().relocMap().find(*offset_ptr); | ||||
|       if (AI != cu->getContext().relocMap().end()) { | ||||
|       bool InRelocMap = false; | ||||
|       if (const RelocAddrMap *RelocMap = cu->getContext().relocMap()) { | ||||
|         RelocAddrMap::const_iterator AI = RelocMap->find(*offset_ptr); | ||||
|         if (AI != RelocMap->end()) { | ||||
|           const std::pair<uint8_t, int64_t> &R = AI->second; | ||||
|           Value.uval = R.second; | ||||
|           *offset_ptr += R.first; | ||||
|       } else | ||||
|           InRelocMap = true; | ||||
|         } | ||||
|       } | ||||
|       if (!InRelocMap) | ||||
|         Value.uval = data.getU32(offset_ptr); | ||||
|       break; | ||||
|     } | ||||
|   | ||||
| @@ -162,7 +162,7 @@ static void DumpInput(const StringRef &Filename) { | ||||
|                                                         DebugLineSection, | ||||
|                                                         DebugStringSection, | ||||
|                                                         DebugRangesSection, | ||||
|                                                         RelocMap)); | ||||
|                                                         &RelocMap)); | ||||
|   if (Address == -1ULL) { | ||||
|     outs() << Filename | ||||
|            << ":\tfile format " << Obj->getFileFormatName() << "\n\n"; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user