@@ -47,7 +47,8 @@ void* IonEntry::canonicalNativeAddrFor(void* ptr) const {
4747 return (void *)(((uint8_t *)nativeStartAddr ()) + region.nativeOffset ());
4848}
4949
50- uint32_t IonEntry::callStackAtAddr (void * ptr, const char ** results,
50+ uint32_t IonEntry::callStackAtAddr (void * ptr, const char ** labelResults,
51+ uint32_t * sourceIdResults,
5152 uint32_t maxResults) const {
5253 MOZ_ASSERT (maxResults >= 1 );
5354
@@ -63,7 +64,9 @@ uint32_t IonEntry::callStackAtAddr(void* ptr, const char** results,
6364 locationIter.readNext (&scriptIdx, &pcOffset);
6465 MOZ_ASSERT (getStr (scriptIdx));
6566
66- results[count++] = getStr (scriptIdx);
67+ labelResults[count] = getStr (scriptIdx);
68+ sourceIdResults[count] = getScriptSource (scriptIdx).scriptSource ->id ();
69+ count++;
6770 if (count >= maxResults) {
6871 break ;
6972 }
@@ -95,10 +98,12 @@ static IonEntry& IonEntryForIonIC(JSRuntime* rt, const IonICEntry* icEntry) {
9598void * IonICEntry::canonicalNativeAddrFor (void * ptr) const { return ptr; }
9699
97100uint32_t IonICEntry::callStackAtAddr (JSRuntime* rt, void * ptr,
98- const char ** results,
101+ const char ** labelResults,
102+ uint32_t * sourceIdResults,
99103 uint32_t maxResults) const {
100104 const IonEntry& entry = IonEntryForIonIC (rt, this );
101- return entry.callStackAtAddr (rejoinAddr (), results, maxResults);
105+ return entry.callStackAtAddr (rejoinAddr (), labelResults, sourceIdResults,
106+ maxResults);
102107}
103108
104109uint64_t IonICEntry::realmID (JSRuntime* rt) const {
@@ -112,12 +117,14 @@ void* BaselineEntry::canonicalNativeAddrFor(void* ptr) const {
112117 return ptr;
113118}
114119
115- uint32_t BaselineEntry::callStackAtAddr (void * ptr, const char ** results,
120+ uint32_t BaselineEntry::callStackAtAddr (void * ptr, const char ** labelResults,
121+ uint32_t * sourceIdResults,
116122 uint32_t maxResults) const {
117123 MOZ_ASSERT (containsPointer (ptr));
118124 MOZ_ASSERT (maxResults >= 1 );
119125
120- results[0 ] = str ();
126+ labelResults[0 ] = str ();
127+ sourceIdResults[0 ] = scriptSource ().scriptSource ->id ();
121128 return 1 ;
122129}
123130
@@ -126,7 +133,8 @@ void* BaselineInterpreterEntry::canonicalNativeAddrFor(void* ptr) const {
126133}
127134
128135uint32_t BaselineInterpreterEntry::callStackAtAddr (void * ptr,
129- const char ** results,
136+ const char ** labelResults,
137+ uint32_t * sourceIdResults,
130138 uint32_t maxResults) const {
131139 MOZ_CRASH (" shouldn't be called for BaselineInterpreter entries" );
132140}
@@ -149,11 +157,13 @@ bool RealmIndependentSharedEntry::callStackAtAddr(
149157}
150158
151159uint32_t RealmIndependentSharedEntry::callStackAtAddr (
152- void * ptr, const char ** results, uint32_t maxResults) const {
160+ void * ptr, const char ** labelResults, uint32_t * sourceIdResults,
161+ uint32_t maxResults) const {
153162 MOZ_ASSERT (containsPointer (ptr));
154163 MOZ_ASSERT (maxResults >= 1 );
155164
156- results[0 ] = str ();
165+ labelResults[0 ] = str ();
166+ sourceIdResults[0 ] = 0 ;
157167 return 1 ;
158168}
159169
@@ -329,22 +339,28 @@ bool JitcodeGlobalEntry::isJitcodeMarkedFromAnyThread(JSRuntime* rt) {
329339}
330340
331341uint32_t JitcodeGlobalEntry::callStackAtAddr (JSRuntime* rt, void * ptr,
332- const char ** results,
342+ const char ** labelResults,
343+ uint32_t * sourceIdResults,
333344 uint32_t maxResults) const {
334345 switch (kind ()) {
335346 case Kind::Ion:
336- return asIon ().callStackAtAddr (ptr, results, maxResults);
347+ return asIon ().callStackAtAddr (ptr, labelResults, sourceIdResults,
348+ maxResults);
337349 case Kind::IonIC:
338- return asIonIC ().callStackAtAddr (rt, ptr, results, maxResults);
350+ return asIonIC ().callStackAtAddr (rt, ptr, labelResults, sourceIdResults,
351+ maxResults);
339352 case Kind::Baseline:
340- return asBaseline ().callStackAtAddr (ptr, results, maxResults);
353+ return asBaseline ().callStackAtAddr (ptr, labelResults, sourceIdResults,
354+ maxResults);
341355 case Kind::BaselineInterpreter:
342- return asBaselineInterpreter ().callStackAtAddr (ptr, results, maxResults);
356+ return asBaselineInterpreter ().callStackAtAddr (
357+ ptr, labelResults, sourceIdResults, maxResults);
343358 case Kind::Dummy:
344- return asDummy ().callStackAtAddr (rt, ptr, results, maxResults);
359+ return asDummy ().callStackAtAddr (rt, ptr, labelResults, sourceIdResults,
360+ maxResults);
345361 case Kind::RealmIndependentShared:
346- return asRealmIndependentShared ().callStackAtAddr (ptr, results,
347- maxResults);
362+ return asRealmIndependentShared ().callStackAtAddr (
363+ ptr, labelResults, sourceIdResults, maxResults);
348364 }
349365 MOZ_CRASH (" Invalid kind" );
350366}
@@ -957,12 +973,13 @@ bool JitcodeIonTable::WriteIonTable(CompactBufferWriter& writer,
957973JS ::ProfiledFrameHandle::ProfiledFrameHandle(JSRuntime* rt,
958974 js::jit::JitcodeGlobalEntry& entry,
959975 void * addr, const char * label,
960- uint32_t depth)
976+ uint32_t sourceId, uint32_t depth)
961977 : rt_(rt),
962978 entry_(entry),
963979 addr_(addr),
964980 canonicalAddr_(nullptr ),
965981 label_(label),
982+ sourceId_(sourceId),
966983 depth_(depth) {
967984 if (!canonicalAddr_) {
968985 canonicalAddr_ = entry_.canonicalNativeAddrFor (rt_, addr_);
@@ -987,6 +1004,10 @@ JS_PUBLIC_API uint64_t JS::ProfiledFrameHandle::realmID() const {
9871004 return entry_.realmID (rt_);
9881005}
9891006
1007+ JS_PUBLIC_API uint32_t JS::ProfiledFrameHandle::sourceId () const {
1008+ return sourceId_;
1009+ }
1010+
9901011JS_PUBLIC_API JS ::ProfiledFrameRange JS::GetProfiledFrames (JSContext* cx,
9911012 void * addr) {
9921013 JSRuntime* rt = cx->runtime ();
@@ -997,8 +1018,8 @@ JS_PUBLIC_API JS::ProfiledFrameRange JS::GetProfiledFrames(JSContext* cx,
9971018 ProfiledFrameRange result (rt, addr, entry);
9981019
9991020 if (entry) {
1000- result.depth_ = entry->callStackAtAddr (rt, addr, result. labels_ ,
1001- std::size (result.labels_ ));
1021+ result.depth_ = entry->callStackAtAddr (
1022+ rt, addr, result. labels_ , result. sourceIds_ , std::size (result.labels_ ));
10021023 }
10031024 return result;
10041025}
@@ -1008,5 +1029,6 @@ JS::ProfiledFrameHandle JS::ProfiledFrameRange::Iter::operator*() const {
10081029 // and the depth we need to pass to ProfiledFrameHandle goes down.
10091030 uint32_t depth = range_.depth_ - 1 - index_;
10101031 return ProfiledFrameHandle (range_.rt_ , *range_.entry_ , range_.addr_ ,
1011- range_.labels_ [depth], depth);
1032+ range_.labels_ [depth], range_.sourceIds_ [depth],
1033+ depth);
10121034}
0 commit comments