forked from OSchip/llvm-project
				
			DWARF: Remove accessors that parse the whole line table section in one go, this can't possibly work.
The address size is specified by the compile unit associated with a line table, there is no global address size. llvm-svn: 139835
This commit is contained in:
		
							parent
							
								
									d923eb0d1e
								
							
						
					
					
						commit
						679e1752f8
					
				| 
						 | 
					@ -77,15 +77,25 @@ const DWARFDebugAranges *DWARFContext::getDebugAranges() {
 | 
				
			||||||
  return Aranges.get();
 | 
					  return Aranges.get();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const DWARFDebugLine *DWARFContext::getDebugLine() {
 | 
					const DWARFDebugLine::LineTable *
 | 
				
			||||||
  if (Line)
 | 
					DWARFContext::getLineTableForCompileUnit(DWARFCompileUnit *cu) {
 | 
				
			||||||
    return Line.get();
 | 
					  if (!Line)
 | 
				
			||||||
 | 
					    Line.reset(new DWARFDebugLine());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DataExtractor lineData(getLineSection(), isLittleEndian(), 0);
 | 
					  unsigned stmtOffset =
 | 
				
			||||||
 | 
					    cu->getCompileUnitDIE()->getAttributeValueAsUnsigned(cu, DW_AT_stmt_list,
 | 
				
			||||||
 | 
					                                                         -1U);
 | 
				
			||||||
 | 
					  if (stmtOffset == -1U)
 | 
				
			||||||
 | 
					    return 0; // No line table for this compile unit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Line.reset(new DWARFDebugLine());
 | 
					  // See if the line table is cached.
 | 
				
			||||||
  Line->parse(lineData);
 | 
					  if (const DWARFDebugLine::LineTable *lt = Line->getLineTable(stmtOffset))
 | 
				
			||||||
  return Line.get();
 | 
					    return lt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // We have to parse it first.
 | 
				
			||||||
 | 
					  DataExtractor lineData(getLineSection(), isLittleEndian(),
 | 
				
			||||||
 | 
					                         cu->getAddressByteSize());
 | 
				
			||||||
 | 
					  return Line->getOrParseLineTable(lineData, stmtOffset);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DWARFContext::parseCompileUnits() {
 | 
					void DWARFContext::parseCompileUnits() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,8 +59,9 @@ public:
 | 
				
			||||||
  /// Get a pointer to the parsed DebugAranges object.
 | 
					  /// Get a pointer to the parsed DebugAranges object.
 | 
				
			||||||
  const DWARFDebugAranges *getDebugAranges();
 | 
					  const DWARFDebugAranges *getDebugAranges();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Get a pointer to the parsed DWARFDebugLine object.
 | 
					  /// Get a pointer to a parsed line table corresponding to a compile unit.
 | 
				
			||||||
  const DWARFDebugLine *getDebugLine();
 | 
					  const DWARFDebugLine::LineTable *
 | 
				
			||||||
 | 
					  getLineTableForCompileUnit(DWARFCompileUnit *cu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  bool isLittleEndian() const { return IsLittleEndian; }
 | 
					  bool isLittleEndian() const { return IsLittleEndian; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,50 +99,12 @@ void DWARFDebugLine::State::appendRowToMatrix(uint32_t offset) {
 | 
				
			||||||
  Row::postAppend();
 | 
					  Row::postAppend();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DWARFDebugLine::parse(const DataExtractor debug_line_data) {
 | 
					 | 
				
			||||||
  LineTableMap.clear();
 | 
					 | 
				
			||||||
  uint32_t offset = 0;
 | 
					 | 
				
			||||||
  State state;
 | 
					 | 
				
			||||||
  while (debug_line_data.isValidOffset(offset)) {
 | 
					 | 
				
			||||||
    const uint32_t debug_line_offset = offset;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (parseStatementTable(debug_line_data, &offset, state)) {
 | 
					 | 
				
			||||||
      // Make sure we don't don't loop infinitely
 | 
					 | 
				
			||||||
      if (offset <= debug_line_offset)
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      LineTableMap[debug_line_offset] = state;
 | 
					 | 
				
			||||||
      state.reset();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      ++offset; // Try next byte in line table
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DWARFDebugLine::DumpingState::~DumpingState() {}
 | 
					DWARFDebugLine::DumpingState::~DumpingState() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DWARFDebugLine::DumpingState::finalize(uint32_t offset) {
 | 
					void DWARFDebugLine::DumpingState::finalize(uint32_t offset) {
 | 
				
			||||||
  LineTable::dump(OS);
 | 
					  LineTable::dump(OS);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DWARFDebugLine::dump(const DataExtractor debug_line_data, raw_ostream &OS){
 | 
					 | 
				
			||||||
  uint32_t offset = 0;
 | 
					 | 
				
			||||||
  DumpingState state(OS);
 | 
					 | 
				
			||||||
    while (debug_line_data.isValidOffset(offset)) {
 | 
					 | 
				
			||||||
    const uint32_t debug_line_offset = offset;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (parseStatementTable(debug_line_data, &offset, state)) {
 | 
					 | 
				
			||||||
      // Make sure we don't don't loop infinitely
 | 
					 | 
				
			||||||
      if (offset <= debug_line_offset)
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      state.reset();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
      ++offset; // Try next byte in line table
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const DWARFDebugLine::LineTable *
 | 
					const DWARFDebugLine::LineTable *
 | 
				
			||||||
DWARFDebugLine::getLineTable(uint32_t offset) const {
 | 
					DWARFDebugLine::getLineTable(uint32_t offset) const {
 | 
				
			||||||
  LineTableConstIter pos = LineTableMap.find(offset);
 | 
					  LineTableConstIter pos = LineTableMap.find(offset);
 | 
				
			||||||
| 
						 | 
					@ -151,6 +113,20 @@ DWARFDebugLine::getLineTable(uint32_t offset) const {
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const DWARFDebugLine::LineTable *
 | 
				
			||||||
 | 
					DWARFDebugLine::getOrParseLineTable(DataExtractor debug_line_data,
 | 
				
			||||||
 | 
					                                    uint32_t offset) {
 | 
				
			||||||
 | 
					  LineTableIter pos = LineTableMap.find(offset);
 | 
				
			||||||
 | 
					  if (pos == LineTableMap.end()) {
 | 
				
			||||||
 | 
					    // Parse and cache the line table for at this offset.
 | 
				
			||||||
 | 
					    State state;
 | 
				
			||||||
 | 
					    if (!parseStatementTable(debug_line_data, &offset, state))
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					    pos->second = state;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return &pos->second;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool
 | 
					bool
 | 
				
			||||||
DWARFDebugLine::parsePrologue(DataExtractor debug_line_data,
 | 
					DWARFDebugLine::parsePrologue(DataExtractor debug_line_data,
 | 
				
			||||||
                              uint32_t *offset_ptr, Prologue *prologue) {
 | 
					                              uint32_t *offset_ptr, Prologue *prologue) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -147,7 +147,7 @@ public:
 | 
				
			||||||
      DoneParsingLineTable = -1
 | 
					      DoneParsingLineTable = -1
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    State() : row(0) {}
 | 
					    State() : row(StartParsingLineTable) {}
 | 
				
			||||||
    virtual ~State();
 | 
					    virtual ~State();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    virtual void appendRowToMatrix(uint32_t offset);
 | 
					    virtual void appendRowToMatrix(uint32_t offset);
 | 
				
			||||||
| 
						 | 
					@ -173,15 +173,9 @@ public:
 | 
				
			||||||
  static bool parseStatementTable(DataExtractor debug_line_data,
 | 
					  static bool parseStatementTable(DataExtractor debug_line_data,
 | 
				
			||||||
                                  uint32_t *offset_ptr, State &state);
 | 
					                                  uint32_t *offset_ptr, State &state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Parse all information in the debug_line_data into an internal
 | 
					 | 
				
			||||||
  /// representation.
 | 
					 | 
				
			||||||
  void parse(DataExtractor debug_line_data);
 | 
					 | 
				
			||||||
  void parseIfNeeded(DataExtractor debug_line_data) {
 | 
					 | 
				
			||||||
    if (LineTableMap.empty())
 | 
					 | 
				
			||||||
      parse(debug_line_data);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  static void dump(DataExtractor debug_line_data, raw_ostream &OS);
 | 
					 | 
				
			||||||
  const LineTable *getLineTable(uint32_t offset) const;
 | 
					  const LineTable *getLineTable(uint32_t offset) const;
 | 
				
			||||||
 | 
					  const LineTable *getOrParseLineTable(DataExtractor debug_line_data,
 | 
				
			||||||
 | 
					                                       uint32_t offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
  typedef std::map<uint32_t, LineTable> LineTableMapTy;
 | 
					  typedef std::map<uint32_t, LineTable> LineTableMapTy;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue