diff --git a/src/rose/rose_build_bytecode.cpp b/src/rose/rose_build_bytecode.cpp index f79bce5b..ea3a80a3 100644 --- a/src/rose/rose_build_bytecode.cpp +++ b/src/rose/rose_build_bytecode.cpp @@ -3771,6 +3771,7 @@ u32 buildReportPrograms(RoseBuildImpl &build, build_context &bc) { program = flattenProgram({program}); applyFinalSpecialisation(program); programs[id] = writeProgram(bc, program); + build.rm.setProgramOffset(id, programs[id]); DEBUG_PRINTF("program for report %u @ %u (%zu instructions)\n", id, programs.back(), program.size()); } diff --git a/src/util/report_manager.cpp b/src/util/report_manager.cpp index 425f166d..8377ea03 100644 --- a/src/util/report_manager.cpp +++ b/src/util/report_manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Intel Corporation + * Copyright (c) 2015-2016, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -217,6 +217,18 @@ Report ReportManager::getBasicInternalReport(const NGWrapper &g, s32 adj) { return makeECallback(g.reportId, adj, ekey); } +void ReportManager::setProgramOffset(ReportID id, u32 programOffset) { + assert(id < reportIds.size()); + assert(!contains(reportIdToProgramOffset, id)); + reportIdToProgramOffset.emplace(id, programOffset); +} + +u32 ReportManager::getProgramOffset(ReportID id) const { + assert(id < reportIds.size()); + assert(contains(reportIdToProgramOffset, id)); + return reportIdToProgramOffset.at(id); +} + static void ekeysUnion(std::set *ekeys, u32 more) { if (!ekeys->empty()) { diff --git a/src/util/report_manager.h b/src/util/report_manager.h index 4fb68aac..0eed2711 100644 --- a/src/util/report_manager.h +++ b/src/util/report_manager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Intel Corporation + * Copyright (c) 2015-2016, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -113,6 +113,14 @@ public: * ~0U if no dkey is needed. */ u32 getDkey(const Report &r) const; + /** \brief Register a Rose program offset with the given report. */ + void setProgramOffset(ReportID id, u32 programOffset); + + /** \brief Fetch the program offset for a given report. It is a fatal error + * for this to be called with a report for which no program offset has been + * set. */ + u32 getProgramOffset(ReportID id) const; + private: /** \brief Grey box ref, for checking resource limits. */ const Grey &grey; @@ -127,6 +135,9 @@ private: /** \brief Mapping from ReportID to dedupe key. */ std::map reportIdToDedupeKey; + /** \brief Mapping from ReportID to Rose program offset in bytecode. */ + std::map reportIdToProgramOffset; + /** \brief Mapping from external match ids to information about that * id. */ std::map externalIdMap;