From 5b851428f8e8eaead68fafe42aace400abfb72f8 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 11 Oct 2016 12:44:40 -0600 Subject: [PATCH] Bug 553032 - use MOZ_FORMAT_PRINTF in js; r=evilpie MozReview-Commit-ID: DD3DJRkOxmC --HG-- extra : rebase_source : 4f98705e5e2c5ff9860f04384abbc6f5dc18a7a9 --- caps/nsScriptSecurityManager.cpp | 4 +- dom/plugins/base/nsJSNPRuntime.cpp | 2 +- js/src/asmjs/AsmJS.cpp | 9 +- js/src/asmjs/WasmBinary.cpp | 6 +- js/src/asmjs/WasmBinary.h | 2 +- js/src/asmjs/WasmBinaryIterator.h | 2 +- js/src/asmjs/WasmCode.cpp | 6 +- js/src/asmjs/WasmTextToBinary.cpp | 11 +- js/src/devtools/gctrace/gcstats.cpp | 1 + js/src/irregexp/RegExpEngine.cpp | 2 +- js/src/jit/BacktrackingAllocator.cpp | 11 +- js/src/jit/BaselineBailouts.cpp | 38 ++-- js/src/jit/BaselineCompiler.cpp | 9 +- js/src/jit/BaselineDebugModeOSR.cpp | 7 +- js/src/jit/BaselineIC.cpp | 2 +- js/src/jit/CodeGenerator.cpp | 2 +- js/src/jit/FlowAliasAnalysis.cpp | 2 +- js/src/jit/Ion.cpp | 23 +-- js/src/jit/IonAnalysis.cpp | 9 +- js/src/jit/IonBuilder.h | 2 +- js/src/jit/JSONSpewer.cpp | 6 +- js/src/jit/JSONSpewer.h | 4 +- js/src/jit/JitSpewer.h | 6 +- js/src/jit/MIRGenerator.h | 2 +- js/src/jit/OptimizationTracking.cpp | 23 +-- js/src/jit/Recover.cpp | 4 +- js/src/jit/Safepoints.cpp | 3 +- js/src/jit/SharedIC.cpp | 2 +- js/src/jit/SharedIC.h | 6 +- js/src/jit/ValueNumbering.cpp | 6 +- js/src/jit/arm/Assembler-arm.h | 2 +- js/src/jit/arm/disasm/Disasm-arm.cpp | 1 + js/src/jit/shared/CodeGenerator-shared.cpp | 13 +- .../IonAssemblerBufferWithConstantPools.h | 17 +- js/src/jsapi.h | 18 +- js/src/jsobj.cpp | 4 +- js/src/jsopcode.cpp | 8 +- js/src/jsprf.cpp | 169 +++++++----------- js/src/jsprf.h | 18 +- js/src/moz.build | 2 +- js/src/shell/js.cpp | 2 +- js/src/shell/jsoptparse.cpp | 2 +- js/src/shell/jsoptparse.h | 2 +- js/src/shell/moz.build | 2 +- js/src/vm/CodeCoverage.cpp | 26 +-- js/src/vm/Printer.h | 8 +- js/src/vm/TraceLoggingGraph.cpp | 1 + js/src/vm/TypeInference.cpp | 3 +- js/src/vm/TypeInference.h | 2 +- js/xpconnect/loader/mozJSComponentLoader.cpp | 2 + js/xpconnect/src/XPCThrower.cpp | 4 +- js/xpconnect/src/XPCWrappedJSClass.cpp | 2 +- js/xpconnect/src/moz.build | 2 +- js/xpconnect/wrappers/AccessCheck.cpp | 2 +- 54 files changed, 258 insertions(+), 266 deletions(-) diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index 5e27e73728f6..2a60221726dd 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -154,8 +154,8 @@ inline void SetPendingExceptionASCII(JSContext *cx, const char *aMsg) inline void SetPendingException(JSContext *cx, const char16_t *aMsg) { - // FIXME: Need to convert to UTF-8 (bug XXX). - JS_ReportErrorLatin1(cx, "%hs", aMsg); + NS_ConvertUTF16toUTF8 msg(aMsg); + JS_ReportErrorUTF8(cx, "%s", msg.get()); } // Helper class to get stuff from the ClassInfo and not waste extra time with diff --git a/dom/plugins/base/nsJSNPRuntime.cpp b/dom/plugins/base/nsJSNPRuntime.cpp index 020cffd4e69c..d9377a70604d 100644 --- a/dom/plugins/base/nsJSNPRuntime.cpp +++ b/dom/plugins/base/nsJSNPRuntime.cpp @@ -638,7 +638,7 @@ ThrowJSExceptionASCII(JSContext *cx, const char *message) PopException(); } else { - ::JS_ReportErrorASCII(cx, message); + ::JS_ReportErrorASCII(cx, "%s", message); } } diff --git a/js/src/asmjs/AsmJS.cpp b/js/src/asmjs/AsmJS.cpp index 545a95a37842..e375b49bcb7a 100644 --- a/js/src/asmjs/AsmJS.cpp +++ b/js/src/asmjs/AsmJS.cpp @@ -2250,7 +2250,7 @@ class MOZ_STACK_CLASS ModuleValidator return false; } - bool failfOffset(uint32_t offset, const char* fmt, ...) { + bool failfOffset(uint32_t offset, const char* fmt, ...) MOZ_FORMAT_PRINTF(3, 4) { va_list ap; va_start(ap, fmt); failfVAOffset(offset, fmt, ap); @@ -2258,7 +2258,7 @@ class MOZ_STACK_CLASS ModuleValidator return false; } - bool failf(ParseNode* pn, const char* fmt, ...) { + bool failf(ParseNode* pn, const char* fmt, ...) MOZ_FORMAT_PRINTF(3, 4) { va_list ap; va_start(ap, fmt); failfVAOffset(pn->pn_pos.begin, fmt, ap); @@ -2944,7 +2944,7 @@ class MOZ_STACK_CLASS FunctionValidator return m_.fail(pn, str); } - bool failf(ParseNode* pn, const char* fmt, ...) { + bool failf(ParseNode* pn, const char* fmt, ...) MOZ_FORMAT_PRINTF(3, 4) { va_list ap; va_start(ap, fmt); m_.failfVAOffset(pn->pn_pos.begin, fmt, ap); @@ -4720,7 +4720,8 @@ static bool CheckSignatureAgainstExisting(ModuleValidator& m, ParseNode* usepn, const Sig& sig, const Sig& existing) { if (sig.args().length() != existing.args().length()) { - return m.failf(usepn, "incompatible number of arguments (%u here vs. %u before)", + return m.failf(usepn, "incompatible number of arguments (%" PRIuSIZE + " here vs. %" PRIuSIZE " before)", sig.args().length(), existing.args().length()); } diff --git a/js/src/asmjs/WasmBinary.cpp b/js/src/asmjs/WasmBinary.cpp index 4c1946583a6c..f5104f846b3a 100644 --- a/js/src/asmjs/WasmBinary.cpp +++ b/js/src/asmjs/WasmBinary.cpp @@ -57,7 +57,7 @@ wasm::DecodePreamble(Decoder& d) return d.fail("failed to match magic number"); if (!d.readFixedU32(&u32) || u32 != EncodingVersion) - return d.fail("binary version 0x%lx does not match expected version 0x%lx", + return d.fail("binary version 0x%" PRIx32 " does not match expected version 0x%" PRIx32, u32, EncodingVersion); return true; @@ -151,7 +151,7 @@ wasm::DecodeLimits(Decoder& d, Limits* limits) // TODO (bug 1310149): tighten this check (s/3/1) when the AngryBots demo // gets updated. if (flags & ~uint32_t(0x3)) - return d.fail("unexpected bits set in flags: %lu", (flags & ~uint32_t(0x3))); + return d.fail("unexpected bits set in flags: %" PRIu32, (flags & ~uint32_t(0x3))); if (!d.readVarU32(&limits->initial)) return d.fail("expected initial length"); @@ -163,7 +163,7 @@ wasm::DecodeLimits(Decoder& d, Limits* limits) if (limits->initial > maximum) { return d.fail("memory size minimum must not be greater than maximum; " - "maximum length %lu is less than initial length %lu", + "maximum length %" PRIu32 " is less than initial length %" PRIu32 , maximum, limits->initial); } diff --git a/js/src/asmjs/WasmBinary.h b/js/src/asmjs/WasmBinary.h index b81121a8b42e..40ad205f73f3 100644 --- a/js/src/asmjs/WasmBinary.h +++ b/js/src/asmjs/WasmBinary.h @@ -778,7 +778,7 @@ class Decoder error_(error) {} - bool fail(const char* msg, ...); + bool fail(const char* msg, ...) MOZ_FORMAT_PRINTF(2, 3); bool fail(UniqueChars msg); void clearError() { if (error_) diff --git a/js/src/asmjs/WasmBinaryIterator.h b/js/src/asmjs/WasmBinaryIterator.h index 9a9bf1edfa06..ae244044225c 100644 --- a/js/src/asmjs/WasmBinaryIterator.h +++ b/js/src/asmjs/WasmBinaryIterator.h @@ -725,7 +725,7 @@ template bool ExprIter::fail(const char* msg) { - return d_.fail(msg); + return d_.fail("%s", msg); } template diff --git a/js/src/asmjs/WasmCode.cpp b/js/src/asmjs/WasmCode.cpp index 3b0b37c8c1af..619dba2b921e 100644 --- a/js/src/asmjs/WasmCode.cpp +++ b/js/src/asmjs/WasmCode.cpp @@ -796,8 +796,10 @@ Code::ensureProfilingState(JSContext* cx, bool newProfilingEnabled) if (!name.append('\0')) return false; - UniqueChars label(JS_smprintf("%hs (%s:%u)", - name.begin(), + TwoByteChars chars(name.begin(), name.length()); + UniqueChars utf8Name(JS::CharsToNewUTF8CharsZ(nullptr, chars).c_str()); + UniqueChars label(JS_smprintf("%s (%s:%u)", + utf8Name.get(), metadata_->filename.get(), codeRange.funcLineOrBytecode())); if (!label) { diff --git a/js/src/asmjs/WasmTextToBinary.cpp b/js/src/asmjs/WasmTextToBinary.cpp index 822654924e8f..6ac574544680 100644 --- a/js/src/asmjs/WasmTextToBinary.cpp +++ b/js/src/asmjs/WasmTextToBinary.cpp @@ -1488,7 +1488,7 @@ struct WasmParseContext {} bool fail(const char* message) { - error->reset(JS_smprintf(message)); + error->reset(js_strdup(message)); return false; } ~WasmParseContext() { @@ -3336,12 +3336,9 @@ class Resolver return false; } bool failResolveLabel(const char* kind, AstName name) { - Vector nameWithNull; - if (!nameWithNull.append(name.begin(), name.length())) - return false; - if (!nameWithNull.append(0)) - return false; - error_->reset(JS_smprintf("%s label '%hs' not found", kind, nameWithNull.begin())); + TwoByteChars chars(name.begin(), name.length()); + UniqueChars utf8Chars(CharsToNewUTF8CharsZ(nullptr, chars).c_str()); + error_->reset(JS_smprintf("%s label '%s' not found", kind, utf8Chars.get())); return false; } diff --git a/js/src/devtools/gctrace/gcstats.cpp b/js/src/devtools/gctrace/gcstats.cpp index 9b7d22247aef..865e65839dea 100644 --- a/js/src/devtools/gctrace/gcstats.cpp +++ b/js/src/devtools/gctrace/gcstats.cpp @@ -165,6 +165,7 @@ Array, MaxClasses> finalizedHeapObjectCountByCl std::vector, HeapKinds> > objectCountByTypeHeapAndLifetime; static void +MOZ_FORMAT_PRINTF(1, 2) die(const char* format, ...) { va_list va; diff --git a/js/src/irregexp/RegExpEngine.cpp b/js/src/irregexp/RegExpEngine.cpp index 623525d2215a..bc556b4a1ef2 100644 --- a/js/src/irregexp/RegExpEngine.cpp +++ b/js/src/irregexp/RegExpEngine.cpp @@ -1872,7 +1872,7 @@ irregexp::CompilePattern(JSContext* cx, RegExpShared* shared, RegExpCompileData* Analysis analysis(cx, ignore_case, is_ascii, unicode); analysis.EnsureAnalyzed(node); if (analysis.has_failed()) { - JS_ReportErrorASCII(cx, analysis.errorMessage()); + JS_ReportErrorASCII(cx, "%s", analysis.errorMessage()); return RegExpCode(); } diff --git a/js/src/jit/BacktrackingAllocator.cpp b/js/src/jit/BacktrackingAllocator.cpp index 8d2bca22bf67..bb5dfac3624f 100644 --- a/js/src/jit/BacktrackingAllocator.cpp +++ b/js/src/jit/BacktrackingAllocator.cpp @@ -1245,7 +1245,7 @@ bool BacktrackingAllocator::processBundle(MIRGenerator* mir, LiveBundle* bundle) { if (JitSpewEnabled(JitSpew_RegAlloc)) { - JitSpew(JitSpew_RegAlloc, "Allocating %s [priority %lu] [weight %lu]", + JitSpew(JitSpew_RegAlloc, "Allocating %s [priority %" PRIuSIZE "] [weight %" PRIuSIZE "]", bundle->toString().get(), computePriority(bundle), computeSpillWeight(bundle)); } @@ -1437,13 +1437,13 @@ BacktrackingAllocator::tryAllocateRegister(PhysicalRegister& r, LiveBundle* bund if (JitSpewEnabled(JitSpew_RegAlloc)) { if (aliasedConflicting.length() == 1) { LiveBundle* existing = aliasedConflicting[0]; - JitSpew(JitSpew_RegAlloc, " %s collides with %s [weight %lu]", + JitSpew(JitSpew_RegAlloc, " %s collides with %s [weight %" PRIuSIZE "]", r.reg.name(), existing->toString().get(), computeSpillWeight(existing)); } else { JitSpew(JitSpew_RegAlloc, " %s collides with the following", r.reg.name()); for (size_t i = 0; i < aliasedConflicting.length(); i++) { LiveBundle* existing = aliasedConflicting[i]; - JitSpew(JitSpew_RegAlloc, " %s [weight %lu]", + JitSpew(JitSpew_RegAlloc, " %s [weight %" PRIuSIZE "]", existing->toString().get(), computeSpillWeight(existing)); } } @@ -1482,7 +1482,7 @@ bool BacktrackingAllocator::evictBundle(LiveBundle* bundle) { if (JitSpewEnabled(JitSpew_RegAlloc)) { - JitSpew(JitSpew_RegAlloc, " Evicting %s [priority %lu] [weight %lu]", + JitSpew(JitSpew_RegAlloc, " Evicting %s [priority %" PRIuSIZE "] [weight %" PRIuSIZE "]", bundle->toString().get(), computePriority(bundle), computeSpillWeight(bundle)); } @@ -2296,7 +2296,8 @@ LiveBundle::toString() const { AutoEnterOOMUnsafeRegion oomUnsafe; - char *buf = JS_smprintf(""); + // Suppress -Wformat warning. + char *buf = JS_smprintf("%s", ""); for (LiveRange::BundleLinkIterator iter = rangesBegin(); buf && iter; iter++) { buf = JS_sprintf_append(buf, "%s %s", diff --git a/js/src/jit/BaselineBailouts.cpp b/js/src/jit/BaselineBailouts.cpp index 4c990b61de55..0b081c265483 100644 --- a/js/src/jit/BaselineBailouts.cpp +++ b/js/src/jit/BaselineBailouts.cpp @@ -230,11 +230,11 @@ struct BaselineStackBuilder if (info) { if (sizeof(size_t) == 4) { JitSpew(JitSpew_BaselineBailouts, - " WRITE_WRD %p/%p %-15s %08x", + " WRITE_WRD %p/%p %-15s %08" PRIxSIZE, header_->copyStackBottom, virtualPointerAtStackOffset(0), info, w); } else { JitSpew(JitSpew_BaselineBailouts, - " WRITE_WRD %p/%p %-15s %016llx", + " WRITE_WRD %p/%p %-15s %016" PRIxSIZE, header_->copyStackBottom, virtualPointerAtStackOffset(0), info, w); } } @@ -246,7 +246,7 @@ struct BaselineStackBuilder return false; if (info) { JitSpew(JitSpew_BaselineBailouts, - " WRITE_VAL %p/%p %-15s %016llx", + " WRITE_VAL %p/%p %-15s %016" PRIx64, header_->copyStackBottom, virtualPointerAtStackOffset(0), info, *((uint64_t*) &val)); } @@ -637,7 +637,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC, // | ReturnAddr | <-- return into main jitcode after IC // +===============+ - JitSpew(JitSpew_BaselineBailouts, " Unpacking %s:%d", script->filename(), script->lineno()); + JitSpew(JitSpew_BaselineBailouts, " Unpacking %s:%" PRIuSIZE, script->filename(), script->lineno()); JitSpew(JitSpew_BaselineBailouts, " [BASELINE-JS FRAME]"); // Calculate and write the previous frame pointer value. @@ -749,7 +749,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC, } JitSpew(JitSpew_BaselineBailouts, " EnvChain=%p", envChain); blFrame->setEnvironmentChain(envChain); - JitSpew(JitSpew_BaselineBailouts, " ReturnValue=%016llx", *((uint64_t*) &returnValue)); + JitSpew(JitSpew_BaselineBailouts, " ReturnValue=%016" PRIx64, *((uint64_t*) &returnValue)); blFrame->setReturnValue(returnValue); // Do not need to initialize scratchValue field in BaselineFrame. @@ -764,13 +764,13 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC, // in the calling frame. Value thisv = iter.read(); JitSpew(JitSpew_BaselineBailouts, " Is function!"); - JitSpew(JitSpew_BaselineBailouts, " thisv=%016llx", *((uint64_t*) &thisv)); + JitSpew(JitSpew_BaselineBailouts, " thisv=%016" PRIx64, *((uint64_t*) &thisv)); size_t thisvOffset = builder.framePushed() + JitFrameLayout::offsetOfThis(); builder.valuePointerAtStackOffset(thisvOffset).set(thisv); MOZ_ASSERT(iter.numAllocations() >= CountArgSlots(script, fun)); - JitSpew(JitSpew_BaselineBailouts, " frame slots %u, nargs %u, nfixed %u", + JitSpew(JitSpew_BaselineBailouts, " frame slots %u, nargs %" PRIuSIZE ", nfixed %" PRIuSIZE, iter.numAllocations(), fun->nargs(), script->nfixed()); if (!callerPC) { @@ -786,7 +786,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC, for (uint32_t i = 0; i < fun->nargs(); i++) { Value arg = iter.read(); - JitSpew(JitSpew_BaselineBailouts, " arg %d = %016llx", + JitSpew(JitSpew_BaselineBailouts, " arg %d = %016" PRIx64, (int) i, *((uint64_t*) &arg)); if (callerPC) { size_t argOffset = builder.framePushed() + JitFrameLayout::offsetOfActualArg(i); @@ -1314,7 +1314,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC, return false; // Push callee token (must be a JS Function) - JitSpew(JitSpew_BaselineBailouts, " Callee = %016llx", callee.asRawBits()); + JitSpew(JitSpew_BaselineBailouts, " Callee = %016" PRIx64, callee.asRawBits()); JSFunction* calleeFun = &callee.toObject().as(); if (!builder.writePtr(CalleeToToken(calleeFun, JSOp(*pc) == JSOP_NEW), "CalleeToken")) @@ -1494,7 +1494,7 @@ jit::BailoutIonToBaseline(JSContext* cx, JitActivation* activation, JitFrameIter // | ||||| | // +---------------+ - JitSpew(JitSpew_BaselineBailouts, "Bailing to baseline %s:%u (IonScript=%p) (FrameType=%d)", + JitSpew(JitSpew_BaselineBailouts, "Bailing to baseline %s:%" PRIuSIZE " (IonScript=%p) (FrameType=%d)", iter.script()->filename(), iter.script()->lineno(), (void*) iter.ionScript(), (int) prevFrameType); @@ -1514,7 +1514,7 @@ jit::BailoutIonToBaseline(JSContext* cx, JitActivation* activation, JitFrameIter propagatingExceptionForDebugMode = false; } - JitSpew(JitSpew_BaselineBailouts, " Reading from snapshot offset %u size %u", + JitSpew(JitSpew_BaselineBailouts, " Reading from snapshot offset %u size %" PRIuSIZE, iter.snapshotOffset(), iter.ionScript()->snapshotsListSize()); if (!excInfo) @@ -1540,7 +1540,7 @@ jit::BailoutIonToBaseline(JSContext* cx, JitActivation* activation, JitFrameIter RootedFunction callee(cx, iter.maybeCallee()); RootedScript scr(cx, iter.script()); if (callee) { - JitSpew(JitSpew_BaselineBailouts, " Callee function (%s:%u)", + JitSpew(JitSpew_BaselineBailouts, " Callee function (%s:%" PRIuSIZE ")", scr->filename(), scr->lineno()); } else { JitSpew(JitSpew_BaselineBailouts, " No callee!"); @@ -1575,7 +1575,7 @@ jit::BailoutIonToBaseline(JSContext* cx, JitActivation* activation, JitFrameIter TraceLogStartEvent(logger, TraceLogger_Baseline); } - JitSpew(JitSpew_BaselineBailouts, " FrameNo %d", frameNo); + JitSpew(JitSpew_BaselineBailouts, " FrameNo %" PRIuSIZE, frameNo); // If we are bailing out to a catch or finally block in this frame, // pass excInfo to InitFromBailout and don't unpack any other frames. @@ -1671,7 +1671,7 @@ InvalidateAfterBailout(JSContext* cx, HandleScript outerScript, const char* reas static void HandleBoundsCheckFailure(JSContext* cx, HandleScript outerScript, HandleScript innerScript) { - JitSpew(JitSpew_IonBailouts, "Bounds check failure %s:%d, inlined into %s:%d", + JitSpew(JitSpew_IonBailouts, "Bounds check failure %s:%" PRIuSIZE ", inlined into %s:%" PRIuSIZE, innerScript->filename(), innerScript->lineno(), outerScript->filename(), outerScript->lineno()); @@ -1686,7 +1686,7 @@ HandleBoundsCheckFailure(JSContext* cx, HandleScript outerScript, HandleScript i static void HandleShapeGuardFailure(JSContext* cx, HandleScript outerScript, HandleScript innerScript) { - JitSpew(JitSpew_IonBailouts, "Shape guard failure %s:%d, inlined into %s:%d", + JitSpew(JitSpew_IonBailouts, "Shape guard failure %s:%" PRIuSIZE ", inlined into %s:%" PRIuSIZE, innerScript->filename(), innerScript->lineno(), outerScript->filename(), outerScript->lineno()); @@ -1701,7 +1701,7 @@ HandleShapeGuardFailure(JSContext* cx, HandleScript outerScript, HandleScript in static void HandleBaselineInfoBailout(JSContext* cx, HandleScript outerScript, HandleScript innerScript) { - JitSpew(JitSpew_IonBailouts, "Baseline info failure %s:%d, inlined into %s:%d", + JitSpew(JitSpew_IonBailouts, "Baseline info failure %s:%" PRIuSIZE ", inlined into %s:%" PRIuSIZE, innerScript->filename(), innerScript->lineno(), outerScript->filename(), outerScript->lineno()); @@ -1711,7 +1711,7 @@ HandleBaselineInfoBailout(JSContext* cx, HandleScript outerScript, HandleScript static void HandleLexicalCheckFailure(JSContext* cx, HandleScript outerScript, HandleScript innerScript) { - JitSpew(JitSpew_IonBailouts, "Lexical check failure %s:%d, inlined into %s:%d", + JitSpew(JitSpew_IonBailouts, "Lexical check failure %s:%" PRIuSIZE ", inlined into %s:%" PRIuSIZE, innerScript->filename(), innerScript->lineno(), outerScript->filename(), outerScript->lineno()); @@ -1754,7 +1754,7 @@ CopyFromRematerializedFrame(JSContext* cx, JitActivation* act, uint8_t* fp, size frame->setHasCachedSavedFrame(); JitSpew(JitSpew_BaselineBailouts, - " Copied from rematerialized frame at (%p,%u)", + " Copied from rematerialized frame at (%p,%" PRIuSIZE ")", fp, inlineDepth); // Propagate the debuggee frame flag. For the case where the Debugger did @@ -1891,7 +1891,7 @@ jit::FinishBailoutToBaseline(BaselineBailoutInfo* bailoutInfo) } JitSpew(JitSpew_BaselineBailouts, - " Restored outerScript=(%s:%u,%u) innerScript=(%s:%u,%u) (bailoutKind=%u)", + " Restored outerScript=(%s:%" PRIuSIZE ",%u) innerScript=(%s:%" PRIuSIZE ",%u) (bailoutKind=%u)", outerScript->filename(), outerScript->lineno(), outerScript->getWarmUpCount(), innerScript->filename(), innerScript->lineno(), innerScript->getWarmUpCount(), (unsigned) bailoutKind); diff --git a/js/src/jit/BaselineCompiler.cpp b/js/src/jit/BaselineCompiler.cpp index 5c9174655a9a..846a6cd3c816 100644 --- a/js/src/jit/BaselineCompiler.cpp +++ b/js/src/jit/BaselineCompiler.cpp @@ -7,6 +7,7 @@ #include "jit/BaselineCompiler.h" #include "mozilla/Casting.h" +#include "mozilla/SizePrintfMacros.h" #include "jit/BaselineIC.h" #include "jit/BaselineJIT.h" @@ -82,10 +83,10 @@ BaselineCompiler::addPCMappingEntry(bool addIndexEntry) MethodStatus BaselineCompiler::compile() { - JitSpew(JitSpew_BaselineScripts, "Baseline compiling script %s:%d (%p)", + JitSpew(JitSpew_BaselineScripts, "Baseline compiling script %s:%" PRIuSIZE " (%p)", script->filename(), script->lineno(), script); - JitSpew(JitSpew_Codegen, "# Emitting baseline code for script %s:%d", + JitSpew(JitSpew_Codegen, "# Emitting baseline code for script %s:%" PRIuSIZE, script->filename(), script->lineno()); TraceLoggerThread* logger = TraceLoggerForMainThread(cx->runtime()); @@ -217,7 +218,7 @@ BaselineCompiler::compile() baselineScript->setMethod(code); baselineScript->setTemplateEnvironment(templateEnv); - JitSpew(JitSpew_BaselineScripts, "Created BaselineScript %p (raw %p) for %s:%d", + JitSpew(JitSpew_BaselineScripts, "Created BaselineScript %p (raw %p) for %s:%" PRIuSIZE, (void*) baselineScript.get(), (void*) code->raw(), script->filename(), script->lineno()); @@ -279,7 +280,7 @@ BaselineCompiler::compile() // Always register a native => bytecode mapping entry, since profiler can be // turned on with baseline jitcode on stack, and baseline jitcode cannot be invalidated. { - JitSpew(JitSpew_Profiling, "Added JitcodeGlobalEntry for baseline script %s:%d (%p)", + JitSpew(JitSpew_Profiling, "Added JitcodeGlobalEntry for baseline script %s:%" PRIuSIZE " (%p)", script->filename(), script->lineno(), baselineScript.get()); // Generate profiling string. diff --git a/js/src/jit/BaselineDebugModeOSR.cpp b/js/src/jit/BaselineDebugModeOSR.cpp index 889f44dc9b70..8b937ee24591 100644 --- a/js/src/jit/BaselineDebugModeOSR.cpp +++ b/js/src/jit/BaselineDebugModeOSR.cpp @@ -7,6 +7,7 @@ #include "jit/BaselineDebugModeOSR.h" #include "mozilla/DebugOnly.h" +#include "mozilla/SizePrintfMacros.h" #include "jit/BaselineIC.h" #include "jit/JitcodeMap.h" @@ -322,7 +323,7 @@ SpewPatchBaselineFrame(uint8_t* oldReturnAddress, uint8_t* newReturnAddress, JSScript* script, ICEntry::Kind frameKind, jsbytecode* pc) { JitSpew(JitSpew_BaselineDebugModeOSR, - "Patch return %p -> %p on BaselineJS frame (%s:%d) from %s at %s", + "Patch return %p -> %p on BaselineJS frame (%s:%" PRIuSIZE ") from %s at %s", oldReturnAddress, newReturnAddress, script->filename(), script->lineno(), ICEntryKindToString(frameKind), CodeName[(JSOp)*pc]); } @@ -332,7 +333,7 @@ SpewPatchBaselineFrameFromExceptionHandler(uint8_t* oldReturnAddress, uint8_t* n JSScript* script, jsbytecode* pc) { JitSpew(JitSpew_BaselineDebugModeOSR, - "Patch return %p -> %p on BaselineJS frame (%s:%d) from exception handler at %s", + "Patch return %p -> %p on BaselineJS frame (%s:%" PRIuSIZE ") from exception handler at %s", oldReturnAddress, newReturnAddress, script->filename(), script->lineno(), CodeName[(JSOp)*pc]); } @@ -667,7 +668,7 @@ RecompileBaselineScriptForDebugMode(JSContext* cx, JSScript* script, if (oldBaselineScript->hasDebugInstrumentation() == observing) return true; - JitSpew(JitSpew_BaselineDebugModeOSR, "Recompiling (%s:%d) for %s", + JitSpew(JitSpew_BaselineDebugModeOSR, "Recompiling (%s:%" PRIuSIZE ") for %s", script->filename(), script->lineno(), observing ? "DEBUGGING" : "NORMAL EXECUTION"); script->setBaselineScript(cx->runtime(), nullptr); diff --git a/js/src/jit/BaselineIC.cpp b/js/src/jit/BaselineIC.cpp index 5835283268d4..4f43c18989d0 100644 --- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -2586,7 +2586,7 @@ DoSetElemFallback(JSContext* cx, BaselineFrame* frame, ICSetElem_Fallback* stub_ { JitSpew(JitSpew_BaselineIC, " Generating SetElem_DenseOrUnboxedArrayAdd stub " - "(shape=%p, group=%p, protoDepth=%u)", + "(shape=%p, group=%p, protoDepth=%" PRIuSIZE ")", shape.get(), group.get(), protoDepth); ICSetElemDenseOrUnboxedArrayAddCompiler compiler(cx, obj, protoDepth); ICUpdatedStub* newStub = compiler.getStub(compiler.getStubSpace(outerScript)); diff --git a/js/src/jit/CodeGenerator.cpp b/js/src/jit/CodeGenerator.cpp index 680748482a3c..72018eacd719 100644 --- a/js/src/jit/CodeGenerator.cpp +++ b/js/src/jit/CodeGenerator.cpp @@ -9244,7 +9244,7 @@ CodeGenerator::generateWasm(wasm::SigIdDesc sigId, wasm::TrapOffset trapOffset, bool CodeGenerator::generate() { - JitSpew(JitSpew_Codegen, "# Emitting code for script %s:%d", + JitSpew(JitSpew_Codegen, "# Emitting code for script %s:%" PRIuSIZE, gen->info().script()->filename(), gen->info().script()->lineno()); diff --git a/js/src/jit/FlowAliasAnalysis.cpp b/js/src/jit/FlowAliasAnalysis.cpp index e237163bb7f8..2b88e36785af 100644 --- a/js/src/jit/FlowAliasAnalysis.cpp +++ b/js/src/jit/FlowAliasAnalysis.cpp @@ -402,7 +402,7 @@ DumpImprovement(MDefinition *load, MDefinitionVector& input, MDefinitionVector& if (JitSpewEnabled(JitSpew_Alias)) { Fprinter &print = JitSpewPrinter(); JitSpewHeader(JitSpew_Alias); - print.printf(" Improve dependency from ", load->id()); + print.printf(" Improve dependency from %d", load->id()); DumpStoreList(input); print.printf(" to "); DumpStoreList(output); diff --git a/js/src/jit/Ion.cpp b/js/src/jit/Ion.cpp index 6e164d058f6f..13c20fc41edd 100644 --- a/js/src/jit/Ion.cpp +++ b/js/src/jit/Ion.cpp @@ -6,6 +6,7 @@ #include "jit/Ion.h" +#include "mozilla/IntegerPrintfMacros.h" #include "mozilla/MemoryReporting.h" #include "mozilla/SizePrintfMacros.h" #include "mozilla/ThreadLocal.h" @@ -2136,7 +2137,7 @@ TrackIonAbort(JSContext* cx, JSScript* script, jsbytecode* pc, const char* messa static void TrackAndSpewIonAbort(JSContext* cx, JSScript* script, const char* message) { - JitSpew(JitSpew_IonAbort, message); + JitSpew(JitSpew_IonAbort, "%s", message); TrackIonAbort(cx, script, script->code(), message); } @@ -2395,7 +2396,7 @@ CheckScriptSize(JSContext* cx, JSScript* script) numLocalsAndArgs > MAX_MAIN_THREAD_LOCALS_AND_ARGS) { if (!OffThreadCompilationAvailable(cx)) { - JitSpew(JitSpew_IonAbort, "Script too large (%u bytes) (%u locals/args)", + JitSpew(JitSpew_IonAbort, "Script too large (%" PRIuSIZE " bytes) (%u locals/args)", script->length(), numLocalsAndArgs); TrackIonAbort(cx, script, script->code(), "too large"); return Method_CantCompile; @@ -3014,7 +3015,7 @@ InvalidateActivation(FreeOp* fop, const JitActivationIterator& activations, bool #ifdef JS_JITSPEW switch (it.type()) { case JitFrame_Exit: - JitSpew(JitSpew_IonInvalidate, "#%d exit frame @ %p", frameno, it.fp()); + JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " exit frame @ %p", frameno, it.fp()); break; case JitFrame_BaselineJS: case JitFrame_IonJS: @@ -3029,26 +3030,26 @@ InvalidateActivation(FreeOp* fop, const JitActivationIterator& activations, bool else if (it.isBailoutJS()) type = "Bailing"; JitSpew(JitSpew_IonInvalidate, - "#%d %s JS frame @ %p, %s:%" PRIuSIZE " (fun: %p, script: %p, pc %p)", + "#%" PRIuSIZE " %s JS frame @ %p, %s:%" PRIuSIZE " (fun: %p, script: %p, pc %p)", frameno, type, it.fp(), it.script()->maybeForwardedFilename(), it.script()->lineno(), it.maybeCallee(), (JSScript*)it.script(), it.returnAddressToFp()); break; } case JitFrame_IonStub: - JitSpew(JitSpew_IonInvalidate, "#%d ion stub frame @ %p", frameno, it.fp()); + JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " ion stub frame @ %p", frameno, it.fp()); break; case JitFrame_BaselineStub: - JitSpew(JitSpew_IonInvalidate, "#%d baseline stub frame @ %p", frameno, it.fp()); + JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " baseline stub frame @ %p", frameno, it.fp()); break; case JitFrame_Rectifier: - JitSpew(JitSpew_IonInvalidate, "#%d rectifier frame @ %p", frameno, it.fp()); + JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " rectifier frame @ %p", frameno, it.fp()); break; case JitFrame_IonAccessorIC: - JitSpew(JitSpew_IonInvalidate, "#%d ion IC getter/setter frame @ %p", frameno, it.fp()); + JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " ion IC getter/setter frame @ %p", frameno, it.fp()); break; case JitFrame_Entry: - JitSpew(JitSpew_IonInvalidate, "#%d entry frame @ %p", frameno, it.fp()); + JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " entry frame @ %p", frameno, it.fp()); break; } #endif // JS_JITSPEW @@ -3143,7 +3144,7 @@ InvalidateActivation(FreeOp* fop, const JitActivationIterator& activations, bool CodeLocationLabel osiPatchPoint = SafepointReader::InvalidationPatchPoint(ionScript, si); CodeLocationLabel invalidateEpilogue(ionCode, CodeOffset(ionScript->invalidateEpilogueOffset())); - JitSpew(JitSpew_IonInvalidate, " ! Invalidate ionScript %p (inv count %u) -> patching osipoint %p", + JitSpew(JitSpew_IonInvalidate, " ! Invalidate ionScript %p (inv count %" PRIuSIZE ") -> patching osipoint %p", ionScript, ionScript->invalidationCount(), (void*) osiPatchPoint.raw()); Assembler::PatchWrite_NearCall(osiPatchPoint, invalidateEpilogue); } @@ -3360,7 +3361,7 @@ AutoFlushICache::setRange(uintptr_t start, size_t len) AutoFlushICache* afc = TlsPerThreadData.get()->PerThreadData::autoFlushICache(); MOZ_ASSERT(afc); MOZ_ASSERT(!afc->start_); - JitSpewCont(JitSpew_CacheFlush, "(%x %x):", start, len); + JitSpewCont(JitSpew_CacheFlush, "(%" PRIxPTR " %" PRIxSIZE "):", start, len); uintptr_t stop = start + len; afc->start_ = start; diff --git a/js/src/jit/IonAnalysis.cpp b/js/src/jit/IonAnalysis.cpp index e683b9fb695d..294331b10865 100644 --- a/js/src/jit/IonAnalysis.cpp +++ b/js/src/jit/IonAnalysis.cpp @@ -6,6 +6,8 @@ #include "jit/IonAnalysis.h" +#include "mozilla/SizePrintfMacros.h" + #include "jit/AliasAnalysis.h" #include "jit/BaselineInspector.h" #include "jit/BaselineJIT.h" @@ -445,9 +447,10 @@ jit::PruneUnusedBranches(MIRGenerator* mir, MIRGraph& graph) shouldBailout = false; JitSpew(JitSpew_Prune, "info: block %d," - " predCount: %lu, domInst: %lu, span: %lu, effectful: %lu, " - " isLoopExit: %s, numSuccessorsOfPred: %lu." - " (score: %lu, shouldBailout: %s)", + " predCount: %" PRIuSIZE ", domInst: %" PRIuSIZE + ", span: %" PRIuSIZE ", effectful: %" PRIuSIZE ", " + " isLoopExit: %s, numSuccessorsOfPred: %" PRIuSIZE "." + " (score: %" PRIuSIZE ", shouldBailout: %s)", block->id(), predCount, numDominatedInst, branchSpan, numEffectfulInst, isLoopExit ? "true" : "false", numSuccessorsOfPreds, score, shouldBailout ? "true" : "false"); diff --git a/js/src/jit/IonBuilder.h b/js/src/jit/IonBuilder.h index 42797a84c8bd..868d9e8e497f 100644 --- a/js/src/jit/IonBuilder.h +++ b/js/src/jit/IonBuilder.h @@ -229,7 +229,7 @@ class IonBuilder MOZ_MUST_USE bool inspectOpcode(JSOp op); uint32_t readIndex(jsbytecode* pc); JSAtom* readAtom(jsbytecode* pc); - bool abort(const char* message, ...); + bool abort(const char* message, ...) MOZ_FORMAT_PRINTF(2, 3); void trackActionableAbort(const char* message); void spew(const char* message); diff --git a/js/src/jit/JSONSpewer.cpp b/js/src/jit/JSONSpewer.cpp index d6105f498bab..330b419f5774 100644 --- a/js/src/jit/JSONSpewer.cpp +++ b/js/src/jit/JSONSpewer.cpp @@ -8,6 +8,8 @@ #include "jit/JSONSpewer.h" +#include "mozilla/SizePrintfMacros.h" + #include #include "jit/BacktrackingAllocator.h" @@ -146,7 +148,7 @@ JSONSpewer::beginFunction(JSScript* script) { beginObject(); if (script) - stringProperty("name", "%s:%d", script->filename(), script->lineno()); + stringProperty("name", "%s:%" PRIuSIZE, script->filename(), script->lineno()); else stringProperty("name", "asm.js compilation"); beginListProperty("passes"); @@ -156,7 +158,7 @@ void JSONSpewer::beginPass(const char* pass) { beginObject(); - stringProperty("name", pass); + stringProperty("name", "%s", pass); } void diff --git a/js/src/jit/JSONSpewer.h b/js/src/jit/JSONSpewer.h index f4172c6b46ed..02f449c7ab04 100644 --- a/js/src/jit/JSONSpewer.h +++ b/js/src/jit/JSONSpewer.h @@ -36,8 +36,8 @@ class JSONSpewer void beginObject(); void beginObjectProperty(const char* name); void beginListProperty(const char* name); - void stringValue(const char* format, ...); - void stringProperty(const char* name, const char* format, ...); + void stringValue(const char* format, ...) MOZ_FORMAT_PRINTF(2, 3); + void stringProperty(const char* name, const char* format, ...) MOZ_FORMAT_PRINTF(3, 4); void beginStringProperty(const char* name); void endStringProperty(); void integerValue(int value); diff --git a/js/src/jit/JitSpewer.h b/js/src/jit/JitSpewer.h index 024e7d5a1ff8..a44eec4662f9 100644 --- a/js/src/jit/JitSpewer.h +++ b/js/src/jit/JitSpewer.h @@ -172,9 +172,9 @@ class JitSpewIndent ~JitSpewIndent(); }; -void JitSpew(JitSpewChannel channel, const char* fmt, ...); -void JitSpewStart(JitSpewChannel channel, const char* fmt, ...); -void JitSpewCont(JitSpewChannel channel, const char* fmt, ...); +void JitSpew(JitSpewChannel channel, const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3); +void JitSpewStart(JitSpewChannel channel, const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3); +void JitSpewCont(JitSpewChannel channel, const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3); void JitSpewFin(JitSpewChannel channel); void JitSpewHeader(JitSpewChannel channel); bool JitSpewEnabled(JitSpewChannel channel); diff --git a/js/src/jit/MIRGenerator.h b/js/src/jit/MIRGenerator.h index 2aedc1a924a6..342ff2945431 100644 --- a/js/src/jit/MIRGenerator.h +++ b/js/src/jit/MIRGenerator.h @@ -72,7 +72,7 @@ class MIRGenerator // Set an error state and prints a message. Returns false so errors can be // propagated up. - bool abort(const char* message, ...); // always returns false + bool abort(const char* message, ...) MOZ_FORMAT_PRINTF(2, 3); // always returns false bool abortFmt(const char* message, va_list ap); // always returns false bool errored() const { diff --git a/js/src/jit/OptimizationTracking.cpp b/js/src/jit/OptimizationTracking.cpp index 029b3c082be1..8ef16e33938a 100644 --- a/js/src/jit/OptimizationTracking.cpp +++ b/js/src/jit/OptimizationTracking.cpp @@ -326,7 +326,7 @@ UniqueTrackedOptimizations::sortByFrequency(JSContext* cx) MOZ_ASSERT(p); p->value().index = sorted_.length(); - JitSpew(JitSpew_OptimizationTracking, " Entry %u has frequency %u", + JitSpew(JitSpew_OptimizationTracking, " Entry %" PRIuSIZE " has frequency %" PRIu32, sorted_.length(), p->value().frequency); if (!sorted_.append(entries[i])) @@ -765,14 +765,14 @@ IonTrackedOptimizationsRegion::WriteRun(CompactBufferWriter& writer, const UniqueTrackedOptimizations& unique) { // Write the header, which is the range that this whole run encompasses. - JitSpew(JitSpew_OptimizationTracking, " Header: [%u, %u]", + JitSpew(JitSpew_OptimizationTracking, " Header: [%" PRIuSIZE ", %" PRIuSIZE "]", start->startOffset.offset(), (end - 1)->endOffset.offset()); writer.writeUnsigned(start->startOffset.offset()); writer.writeUnsigned((end - 1)->endOffset.offset()); // Write the first entry of the run, which is not delta-encoded. JitSpew(JitSpew_OptimizationTracking, - " [%6u, %6u] vector %3u, offset %4u", + " [%6" PRIuSIZE ", %6" PRIuSIZE "] vector %3u, offset %4" PRIuSIZE, start->startOffset.offset(), start->endOffset.offset(), unique.indexOf(start->optimizations), writer.length()); uint32_t prevEndOffset = start->endOffset.offset(); @@ -789,7 +789,7 @@ IonTrackedOptimizationsRegion::WriteRun(CompactBufferWriter& writer, uint8_t index = unique.indexOf(entry->optimizations); JitSpew(JitSpew_OptimizationTracking, - " [%6u, %6u] delta [+%5u, +%5u] vector %3u, offset %4u", + " [%6u, %6u] delta [+%5u, +%5u] vector %3u, offset %4" PRIuSIZE, startOffset, endOffset, startDelta, length, index, writer.length()); WriteDelta(writer, startDelta, length, index); @@ -825,7 +825,7 @@ WriteOffsetsTable(CompactBufferWriter& writer, const Vector& offse // Write entry offset table. for (size_t i = 0; i < offsets.length(); i++) { - JitSpew(JitSpew_OptimizationTracking, " Entry %u reverse offset %u", + JitSpew(JitSpew_OptimizationTracking, " Entry %" PRIuSIZE " reverse offset %u", i, tableOffset - padding - offsets[i]); writer.writeNativeEndianUint32_t(tableOffset - padding - offsets[i]); } @@ -919,7 +919,7 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write if (JitSpewEnabled(JitSpew_OptimizationTracking)) { JitSpewStart(JitSpew_OptimizationTracking, "=> Training data: "); for (const NativeToTrackedOptimizations* entry = start; entry != end; entry++) { - JitSpewCont(JitSpew_OptimizationTracking, "%u,%u,%u ", + JitSpewCont(JitSpew_OptimizationTracking, "%" PRIuSIZE ",%" PRIuSIZE ",%u ", entry->startOffset.offset(), entry->endOffset.offset(), unique.indexOf(entry->optimizations)); } @@ -934,7 +934,8 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write JitSpew(JitSpew_Profiling, "=> Writing regions"); while (entry != end) { uint32_t runLength = IonTrackedOptimizationsRegion::ExpectedRunLength(entry, end); - JitSpew(JitSpew_OptimizationTracking, " Run at entry %u, length %u, offset %u", + JitSpew(JitSpew_OptimizationTracking, + " Run at entry %" PRIuSIZE ", length %" PRIu32 ", offset %" PRIuSIZE, entry - start, runLength, writer.length()); if (!offsets.append(writer.length())) @@ -957,7 +958,7 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write offsets.clear(); const UniqueTrackedOptimizations::SortedVector& vec = unique.sortedVector(); - JitSpew(JitSpew_OptimizationTracking, "=> Writing unique optimizations table with %u entr%s", + JitSpew(JitSpew_OptimizationTracking, "=> Writing unique optimizations table with %" PRIuSIZE " entr%s", vec.length(), vec.length() == 1 ? "y" : "ies"); // Write out type info payloads. @@ -967,7 +968,8 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write for (const UniqueTrackedOptimizations::SortEntry* p = vec.begin(); p != vec.end(); p++) { const TempOptimizationTypeInfoVector* v = p->types; - JitSpew(JitSpew_OptimizationTracking, " Type info entry %u of length %u, offset %u", + JitSpew(JitSpew_OptimizationTracking, + " Type info entry %" PRIuSIZE " of length %" PRIuSIZE ", offset %" PRIuSIZE, p - vec.begin(), v->length(), writer.length()); SpewTempOptimizationTypeInfoVector(v, " "); @@ -1017,7 +1019,8 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write // Write out attempts payloads. for (const UniqueTrackedOptimizations::SortEntry* p = vec.begin(); p != vec.end(); p++) { const TempOptimizationAttemptsVector* v = p->attempts; - JitSpew(JitSpew_OptimizationTracking, " Attempts entry %u of length %u, offset %u", + JitSpew(JitSpew_OptimizationTracking, + " Attempts entry %" PRIuSIZE " of length %" PRIuSIZE ", offset %" PRIuSIZE, p - vec.begin(), v->length(), writer.length()); SpewTempOptimizationAttemptsVector(v, " "); diff --git a/js/src/jit/Recover.cpp b/js/src/jit/Recover.cpp index 73f4393806eb..93b2c2390a3d 100644 --- a/js/src/jit/Recover.cpp +++ b/js/src/jit/Recover.cpp @@ -6,6 +6,8 @@ #include "jit/Recover.h" +#include "mozilla/SizePrintfMacros.h" + #include "jsapi.h" #include "jscntxt.h" #include "jsmath.h" @@ -123,7 +125,7 @@ MResumePoint::writeRecoverData(CompactBufferWriter& writer) const uint32_t formalArgs = CountArgSlots(script, fun); uint32_t nallocs = formalArgs + script->nfixed() + exprStack; - JitSpew(JitSpew_IonSnapshots, "Starting frame; implicit %u, formals %u, fixed %u, exprs %u", + JitSpew(JitSpew_IonSnapshots, "Starting frame; implicit %u, formals %u, fixed %" PRIuSIZE ", exprs %u", implicit, formalArgs - implicit, script->nfixed(), exprStack); uint32_t pcoff = script->pcToOffset(pc()); diff --git a/js/src/jit/Safepoints.cpp b/js/src/jit/Safepoints.cpp index c775c7d131c0..b0bb530f9933 100644 --- a/js/src/jit/Safepoints.cpp +++ b/js/src/jit/Safepoints.cpp @@ -7,6 +7,7 @@ #include "jit/Safepoints.h" #include "mozilla/MathAlgorithms.h" +#include "mozilla/SizePrintfMacros.h" #include "jit/BitSet.h" #include "jit/JitSpewer.h" @@ -31,7 +32,7 @@ SafepointWriter::init(TempAllocator& alloc) uint32_t SafepointWriter::startEntry() { - JitSpew(JitSpew_Safepoints, "Encoding safepoint (position %d):", stream_.length()); + JitSpew(JitSpew_Safepoints, "Encoding safepoint (position %" PRIuSIZE "):", stream_.length()); return uint32_t(stream_.length()); } diff --git a/js/src/jit/SharedIC.cpp b/js/src/jit/SharedIC.cpp index 1c227439e349..177f5e8e394e 100644 --- a/js/src/jit/SharedIC.cpp +++ b/js/src/jit/SharedIC.cpp @@ -2132,7 +2132,7 @@ UpdateExistingGenerationalDOMProxyStub(ICGetProp_Fallback* stub, // Update generation uint64_t generation = expandoAndGeneration->generation; JitSpew(JitSpew_BaselineIC, - " Updating existing stub with generation, old value: %i, " + " Updating existing stub with generation, old value: %" PRIu64 ", " "new value: %" PRIu64 "", updateStub->generation(), generation); updateStub->setGeneration(generation); diff --git a/js/src/jit/SharedIC.h b/js/src/jit/SharedIC.h index b8e081688897..42198c89096f 100644 --- a/js/src/jit/SharedIC.h +++ b/js/src/jit/SharedIC.h @@ -202,8 +202,10 @@ class ICFallbackStub; #undef FORWARD_DECLARE_STUBS #ifdef JS_JITSPEW -void FallbackICSpew(JSContext* cx, ICFallbackStub* stub, const char* fmt, ...); -void TypeFallbackICSpew(JSContext* cx, ICTypeMonitor_Fallback* stub, const char* fmt, ...); +void FallbackICSpew(JSContext* cx, ICFallbackStub* stub, const char* fmt, ...) + MOZ_FORMAT_PRINTF(3, 4); +void TypeFallbackICSpew(JSContext* cx, ICTypeMonitor_Fallback* stub, const char* fmt, ...) + MOZ_FORMAT_PRINTF(3, 4); #else #define FallbackICSpew(...) #define TypeFallbackICSpew(...) diff --git a/js/src/jit/ValueNumbering.cpp b/js/src/jit/ValueNumbering.cpp index e8b245274bfe..8d563f8ef909 100644 --- a/js/src/jit/ValueNumbering.cpp +++ b/js/src/jit/ValueNumbering.cpp @@ -996,7 +996,7 @@ ValueNumberer::visitBlock(MBasicBlock* block, const MBasicBlock* dominatorRoot) bool ValueNumberer::visitDominatorTree(MBasicBlock* dominatorRoot) { - JitSpew(JitSpew_GVN, " Visiting dominator tree (with %llu blocks) rooted at block%u%s", + JitSpew(JitSpew_GVN, " Visiting dominator tree (with %" PRIu64 " blocks) rooted at block%u%s", uint64_t(dominatorRoot->numDominated()), dominatorRoot->id(), dominatorRoot == graph_.entryBlock() ? " (normal entry block)" : dominatorRoot == graph_.osrBlock() ? " (OSR entry block)" : @@ -1222,7 +1222,7 @@ ValueNumberer::run(UpdateAliasAnalysisFlag updateAliasAnalysis) { updateAliasAnalysis_ = updateAliasAnalysis == UpdateAliasAnalysis; - JitSpew(JitSpew_GVN, "Running GVN on graph (with %llu blocks)", + JitSpew(JitSpew_GVN, "Running GVN on graph (with %" PRIu64 " blocks)", uint64_t(graph_.numBlocks())); // Adding fixup blocks only make sense iff we have a second entry point into @@ -1282,7 +1282,7 @@ ValueNumberer::run(UpdateAliasAnalysisFlag updateAliasAnalysis) break; } - JitSpew(JitSpew_GVN, "Re-running GVN on graph (run %d, now with %llu blocks)", + JitSpew(JitSpew_GVN, "Re-running GVN on graph (run %d, now with %" PRIu64 " blocks)", runs, uint64_t(graph_.numBlocks())); } diff --git a/js/src/jit/arm/Assembler-arm.h b/js/src/jit/arm/Assembler-arm.h index 455a3e828515..04813096c044 100644 --- a/js/src/jit/arm/Assembler-arm.h +++ b/js/src/jit/arm/Assembler-arm.h @@ -1363,7 +1363,7 @@ class Assembler : public AssemblerShared uint32_t spewResolve(Label* l); uint32_t spewProbe(Label* l); uint32_t spewDefine(Label* l); - void spew(const char* fmt, ...); + void spew(const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3); void spew(const char* fmt, va_list args); #endif diff --git a/js/src/jit/arm/disasm/Disasm-arm.cpp b/js/src/jit/arm/disasm/Disasm-arm.cpp index 1e0cb389387b..8bd7bff0c283 100644 --- a/js/src/jit/arm/disasm/Disasm-arm.cpp +++ b/js/src/jit/arm/disasm/Disasm-arm.cpp @@ -43,6 +43,7 @@ namespace disasm { // Helper function for printing to a Vector. static int +MOZ_FORMAT_PRINTF(2, 3) SNPrintF(V8Vector str, const char* format, ...) { va_list args; diff --git a/js/src/jit/shared/CodeGenerator-shared.cpp b/js/src/jit/shared/CodeGenerator-shared.cpp index 30c638edc375..f69cb7449196 100644 --- a/js/src/jit/shared/CodeGenerator-shared.cpp +++ b/js/src/jit/shared/CodeGenerator-shared.cpp @@ -7,6 +7,7 @@ #include "jit/shared/CodeGenerator-shared-inl.h" #include "mozilla/DebugOnly.h" +#include "mozilla/SizePrintfMacros.h" #include "jit/CompactBuffer.h" #include "jit/IonCaches.h" @@ -233,7 +234,7 @@ CodeGeneratorShared::addNativeToBytecodeEntry(const BytecodeSite* site) // bytecodeOffset, but the nativeOffset has changed, do nothing. // The same site just generated some more code. if (lastEntry.tree == tree && lastEntry.pc == pc) { - JitSpew(JitSpew_Profiling, " => In-place update [%u-%u]", + JitSpew(JitSpew_Profiling, " => In-place update [%" PRIuSIZE "-%" PRIu32 "]", lastEntry.nativeOffset.offset(), nativeOffset); return true; } @@ -280,7 +281,7 @@ CodeGeneratorShared::dumpNativeToBytecodeEntries() { #ifdef JS_JITSPEW InlineScriptTree* topTree = gen->info().inlineScriptTree(); - JitSpewStart(JitSpew_Profiling, "Native To Bytecode Entries for %s:%d\n", + JitSpewStart(JitSpew_Profiling, "Native To Bytecode Entries for %s:%" PRIuSIZE "\n", topTree->script()->filename(), topTree->script()->lineno()); for (unsigned i = 0; i < nativeToBytecodeList_.length(); i++) dumpNativeToBytecodeEntry(i); @@ -303,16 +304,16 @@ CodeGeneratorShared::dumpNativeToBytecodeEntry(uint32_t idx) if (nextRef->tree == ref.tree) pcDelta = nextRef->pc - ref.pc; } - JitSpewStart(JitSpew_Profiling, " %08x [+%-6d] => %-6d [%-4d] {%-10s} (%s:%d", + JitSpewStart(JitSpew_Profiling, " %08" PRIxSIZE " [+%-6d] => %-6ld [%-4d] {%-10s} (%s:%" PRIuSIZE, ref.nativeOffset.offset(), nativeDelta, - ref.pc - script->code(), + (long) (ref.pc - script->code()), pcDelta, CodeName[JSOp(*ref.pc)], script->filename(), script->lineno()); for (tree = tree->caller(); tree; tree = tree->caller()) { - JitSpewCont(JitSpew_Profiling, " <= %s:%d", tree->script()->filename(), + JitSpewCont(JitSpew_Profiling, " <= %s:%" PRIuSIZE, tree->script()->filename(), tree->script()->lineno()); } JitSpewCont(JitSpew_Profiling, ")"); @@ -927,7 +928,7 @@ CodeGeneratorShared::generateCompactTrackedOptimizationsMap(JSContext* cx, JitCo "== Compact Native To Optimizations Map [%p-%p] size %u", data, data + trackedOptimizationsMapSize_, trackedOptimizationsMapSize_); JitSpew(JitSpew_OptimizationTracking, - " with type list of length %u, size %u", + " with type list of length %" PRIuSIZE ", size %" PRIuSIZE, allTypes->length(), allTypes->length() * sizeof(IonTrackedTypeWithAddendum)); return true; diff --git a/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h b/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h index c6783c61950a..74fa60b12402 100644 --- a/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h +++ b/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h @@ -8,6 +8,7 @@ #define jit_shared_IonAssemblerBufferWithConstantPools_h #include "mozilla/MathAlgorithms.h" +#include "mozilla/SizePrintfMacros.h" #include @@ -792,7 +793,7 @@ struct AssemblerBufferWithConstantPools : public AssemblerBufferpcToOffset(i.pc())); } else { sprinter.printf(" (%p)\n", i.pc()); diff --git a/js/src/jsopcode.cpp b/js/src/jsopcode.cpp index a492b36831fa..ff340275806e 100644 --- a/js/src/jsopcode.cpp +++ b/js/src/jsopcode.cpp @@ -151,14 +151,14 @@ const char * PCCounts::numExecName = "interp"; static MOZ_MUST_USE bool DumpIonScriptCounts(Sprinter* sp, HandleScript script, jit::IonScriptCounts* ionCounts) { - if (!sp->jsprintf("IonScript [%lu blocks]:\n", ionCounts->numBlocks())) + if (!sp->jsprintf("IonScript [%" PRIuSIZE " blocks]:\n", ionCounts->numBlocks())) return false; for (size_t i = 0; i < ionCounts->numBlocks(); i++) { const jit::IonBlockCounts& block = ionCounts->block(i); unsigned lineNumber = 0, columnNumber = 0; lineNumber = PCToLineNumber(script, script->offsetToPC(block.offset()), &columnNumber); - if (!sp->jsprintf("BB #%lu [%05u,%u,%u]", + if (!sp->jsprintf("BB #%" PRIu32 " [%05u,%u,%u]", block.id(), block.offset(), lineNumber, columnNumber)) { return false; @@ -168,10 +168,10 @@ DumpIonScriptCounts(Sprinter* sp, HandleScript script, jit::IonScriptCounts* ion return false; } for (size_t j = 0; j < block.numSuccessors(); j++) { - if (!sp->jsprintf(" -> #%lu", block.successor(j))) + if (!sp->jsprintf(" -> #%" PRIu32, block.successor(j))) return false; } - if (!sp->jsprintf(" :: %llu hits\n", block.hitCount())) + if (!sp->jsprintf(" :: %" PRIu64 " hits\n", block.hitCount())) return false; if (!sp->jsprintf("%s\n", block.code())) return false; diff --git a/js/src/jsprf.cpp b/js/src/jsprf.cpp index 1f8c1a6dffc3..646b938de834 100644 --- a/js/src/jsprf.cpp +++ b/js/src/jsprf.cpp @@ -63,18 +63,18 @@ struct NumArgState typedef mozilla::Vector NumArgStateVector; -#define TYPE_INT16 0 -#define TYPE_UINT16 1 +#define TYPE_SHORT 0 +#define TYPE_USHORT 1 #define TYPE_INTN 2 #define TYPE_UINTN 3 -#define TYPE_INT32 4 -#define TYPE_UINT32 5 -#define TYPE_INT64 6 -#define TYPE_UINT64 7 +#define TYPE_LONG 4 +#define TYPE_ULONG 5 +#define TYPE_LONGLONG 6 +#define TYPE_ULONGLONG 7 #define TYPE_STRING 8 #define TYPE_DOUBLE 9 #define TYPE_INTSTR 10 -#define TYPE_WSTRING 11 +#define TYPE_POINTER 11 #define TYPE_UNKNOWN 20 #define FLAG_LEFT 0x1 @@ -89,31 +89,9 @@ generic_write(SprintfState* ss, const char* src, size_t srclen) return (*ss->stuff)(ss, src, srclen); } -inline bool -generic_write(SprintfState* ss, const char16_t* src, size_t srclen) -{ - const size_t CHUNK_SIZE = 64; - char chunk[CHUNK_SIZE]; - - size_t j = 0; - size_t i = 0; - while (i < srclen) { - // FIXME: truncates characters to 8 bits - chunk[j++] = char(src[i++]); - - if (j == CHUNK_SIZE || i == srclen) { - if (!(*ss->stuff)(ss, chunk, j)) - return false; - j = 0; - } - } - return true; -} - // Fill into the buffer using the data in src -template static bool -fill2(SprintfState* ss, const Char* src, int srclen, int width, int flags) +fill2(SprintfState* ss, const char* src, int srclen, int width, int flags) { char space = ' '; @@ -318,19 +296,16 @@ static bool cvt_f(SprintfState* ss, double d, const char* fmt0, const char* fmt1 } static inline const char* generic_null_str(const char*) { return "(null)"; } -static inline const char16_t* generic_null_str(const char16_t*) { return u"(null)"; } static inline size_t generic_strlen(const char* s) { return strlen(s); } -static inline size_t generic_strlen(const char16_t* s) { return js_strlen(s); } /* * Convert a string into its printable form. "width" is the output * width. "prec" is the maximum number of characters of "s" to output, * where -1 means until NUL. */ -template static bool -cvt_s(SprintfState* ss, const Char* s, int width, int prec, int flags) +cvt_s(SprintfState* ss, const char* s, int width, int prec, int flags) { if (prec == 0) return true; @@ -452,23 +427,24 @@ BuildArgArray(const char* fmt, va_list ap, NumArgStateVector& nas) // size nas[cn].type = TYPE_INTN; if (c == 'h') { - nas[cn].type = TYPE_INT16; + nas[cn].type = TYPE_SHORT; c = *p++; } else if (c == 'L') { - // XXX not quite sure here - nas[cn].type = TYPE_INT64; + nas[cn].type = TYPE_LONGLONG; c = *p++; } else if (c == 'l') { - nas[cn].type = TYPE_INT32; + nas[cn].type = TYPE_LONG; c = *p++; if (c == 'l') { - nas[cn].type = TYPE_INT64; + nas[cn].type = TYPE_LONGLONG; c = *p++; } } else if (c == 'z' || c == 'I') { - static_assert(sizeof(size_t) == sizeof(int32_t) || sizeof(size_t) == sizeof(int64_t), + static_assert(sizeof(size_t) == sizeof(int) || sizeof(size_t) == sizeof(long) || + sizeof(size_t) == sizeof(long long), "size_t is not one of the expected sizes"); - nas[cn].type = sizeof(size_t) == sizeof(int64_t) ? TYPE_INT64 : TYPE_INT32; + nas[cn].type = sizeof(size_t) == sizeof(int) ? TYPE_INTN : + sizeof(size_t) == sizeof(long) ? TYPE_LONG : TYPE_LONGLONG; c = *p++; } @@ -490,16 +466,7 @@ BuildArgArray(const char* fmt, va_list ap, NumArgStateVector& nas) break; case 'p': - // XXX should use cpp - if (sizeof(void*) == sizeof(int32_t)) { - nas[cn].type = TYPE_UINT32; - } else if (sizeof(void*) == sizeof(int64_t)) { - nas[cn].type = TYPE_UINT64; - } else if (sizeof(void*) == sizeof(int)) { - nas[cn].type = TYPE_UINTN; - } else { - nas[cn].type = TYPE_UNKNOWN; - } + nas[cn].type = TYPE_POINTER; break; case 'C': @@ -512,7 +479,7 @@ BuildArgArray(const char* fmt, va_list ap, NumArgStateVector& nas) break; case 's': - nas[cn].type = (nas[cn].type == TYPE_UINT16) ? TYPE_WSTRING : TYPE_STRING; + nas[cn].type = TYPE_STRING; break; case 'n': @@ -544,18 +511,18 @@ BuildArgArray(const char* fmt, va_list ap, NumArgStateVector& nas) VARARGS_ASSIGN(nas[cn].ap, ap); switch (nas[cn].type) { - case TYPE_INT16: - case TYPE_UINT16: + case TYPE_SHORT: + case TYPE_USHORT: case TYPE_INTN: case TYPE_UINTN: (void) va_arg(ap, int); break; - case TYPE_INT32: (void) va_arg(ap, int32_t); break; - case TYPE_UINT32: (void) va_arg(ap, uint32_t); break; - case TYPE_INT64: (void) va_arg(ap, int64_t); break; - case TYPE_UINT64: (void) va_arg(ap, uint64_t); break; + case TYPE_LONG: (void) va_arg(ap, long); break; + case TYPE_ULONG: (void) va_arg(ap, unsigned long); break; + case TYPE_LONGLONG: (void) va_arg(ap, long long); break; + case TYPE_ULONGLONG: (void) va_arg(ap, unsigned long long); break; case TYPE_STRING: (void) va_arg(ap, char*); break; - case TYPE_WSTRING: (void) va_arg(ap, char16_t*); break; case TYPE_INTSTR: (void) va_arg(ap, int*); break; case TYPE_DOUBLE: (void) va_arg(ap, double); break; + case TYPE_POINTER: (void) va_arg(ap, void*); break; default: MOZ_CRASH(); } @@ -576,14 +543,13 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap) int flags, width, prec, radix, type; union { char ch; - char16_t wch; int i; long l; - int64_t ll; + long long ll; double d; const char* s; - const char16_t* ws; int* ip; + void* p; } u; const char* fmt0; static const char hex[] = "0123456789abcdef"; @@ -685,23 +651,24 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap) // size type = TYPE_INTN; if (c == 'h') { - type = TYPE_INT16; + type = TYPE_SHORT; c = *fmt++; } else if (c == 'L') { - // XXX not quite sure here - type = TYPE_INT64; + type = TYPE_LONGLONG; c = *fmt++; } else if (c == 'l') { - type = TYPE_INT32; + type = TYPE_LONG; c = *fmt++; if (c == 'l') { - type = TYPE_INT64; + type = TYPE_LONGLONG; c = *fmt++; } } else if (c == 'z' || c == 'I') { - static_assert(sizeof(size_t) == sizeof(int32_t) || sizeof(size_t) == sizeof(int64_t), + static_assert(sizeof(size_t) == sizeof(int) || sizeof(size_t) == sizeof(long) || + sizeof(size_t) == sizeof(long long), "size_t is not one of the expected sizes"); - type = sizeof(size_t) == sizeof(int64_t) ? TYPE_INT64 : TYPE_INT32; + type = sizeof(size_t) == sizeof(int) ? TYPE_INTN : + sizeof(size_t) == sizeof(long) ? TYPE_LONG : TYPE_LONGLONG; c = *fmt++; } @@ -735,15 +702,15 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap) fetch_and_convert: switch (type) { - case TYPE_INT16: + case TYPE_SHORT: u.l = va_arg(ap, int); if (u.l < 0) { u.l = -u.l; flags |= FLAG_NEG; } goto do_long; - case TYPE_UINT16: - u.l = va_arg(ap, int) & 0xffff; + case TYPE_USHORT: + u.l = (unsigned short) va_arg(ap, unsigned int); goto do_long; case TYPE_INTN: u.l = va_arg(ap, int); @@ -756,30 +723,33 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap) u.l = (long)va_arg(ap, unsigned int); goto do_long; - case TYPE_INT32: - u.l = va_arg(ap, int32_t); + case TYPE_LONG: + u.l = va_arg(ap, long); if (u.l < 0) { u.l = -u.l; flags |= FLAG_NEG; } goto do_long; - case TYPE_UINT32: - u.l = (long)va_arg(ap, uint32_t); + case TYPE_ULONG: + u.l = (long)va_arg(ap, unsigned long); do_long: if (!cvt_l(ss, u.l, width, prec, radix, type, flags, hexp)) return false; break; - case TYPE_INT64: - u.ll = va_arg(ap, int64_t); + case TYPE_LONGLONG: + u.ll = va_arg(ap, long long); if (u.ll < 0) { u.ll = -u.ll; flags |= FLAG_NEG; } goto do_longlong; - case TYPE_UINT64: - u.ll = va_arg(ap, uint64_t); + case TYPE_POINTER: + u.ll = (uintptr_t)va_arg(ap, void*); + goto do_longlong; + case TYPE_ULONGLONG: + u.ll = va_arg(ap, unsigned long long); do_longlong: if (!cvt_ll(ss, u.ll, width, prec, radix, type, flags, hexp)) return false; @@ -816,7 +786,7 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap) } } switch (type) { - case TYPE_INT16: + case TYPE_SHORT: case TYPE_INTN: u.ch = va_arg(ap, int); if (!(*ss->stuff)(ss, &u.ch, 1)) @@ -832,16 +802,7 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap) break; case 'p': - if (sizeof(void*) == sizeof(int32_t)) { - type = TYPE_UINT32; - } else if (sizeof(void*) == sizeof(int64_t)) { - type = TYPE_UINT64; - } else if (sizeof(void*) == sizeof(int)) { - type = TYPE_UINTN; - } else { - MOZ_ASSERT(0); - break; - } + type = TYPE_POINTER; radix = 16; goto fetch_and_convert; @@ -856,15 +817,9 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap) #endif case 's': - if(type == TYPE_INT16) { - u.ws = va_arg(ap, const char16_t*); - if (!cvt_s(ss, u.ws, width, prec, flags)) - return false; - } else { - u.s = va_arg(ap, const char*); - if (!cvt_s(ss, u.s, width, prec, flags)) - return false; - } + u.s = va_arg(ap, const char*); + if (!cvt_s(ss, u.s, width, prec, flags)) + return false; break; case 'n': @@ -1004,18 +959,18 @@ JS_vsprintf_append(char* last, const char* fmt, va_list ap) return ss.base; } -#undef TYPE_INT16 -#undef TYPE_UINT16 +#undef TYPE_SHORT +#undef TYPE_USHORT #undef TYPE_INTN #undef TYPE_UINTN -#undef TYPE_INT32 -#undef TYPE_UINT32 -#undef TYPE_INT64 -#undef TYPE_UINT64 +#undef TYPE_LONG +#undef TYPE_ULONG +#undef TYPE_LONGLONG +#undef TYPE_ULONGLONG #undef TYPE_STRING #undef TYPE_DOUBLE #undef TYPE_INTSTR -#undef TYPE_WSTRING +#undef TYPE_POINTER #undef TYPE_UNKNOWN #undef FLAG_LEFT diff --git a/js/src/jsprf.h b/js/src/jsprf.h index 3bdbe638472c..b84b5a5c9864 100644 --- a/js/src/jsprf.h +++ b/js/src/jsprf.h @@ -14,11 +14,13 @@ ** %x - unsigned hex ** %X - unsigned uppercase hex ** %o - unsigned octal -** %hd, %hu, %hx, %hX, %ho - 16-bit versions of above -** %ld, %lu, %lx, %lX, %lo - 32-bit versions of above -** %lld, %llu, %llx, %llX, %llo - 64 bit versions of above -** %s - ascii string -** %hs - ucs2 string +** %hd, %hu, %hx, %hX, %ho - "short" versions of above +** %ld, %lu, %lx, %lX, %lo - "long" versions of above +** %lld, %llu, %llx, %llX, %llo - "long long" versions of above +** %zd, %zo, %zu, %zx, %zX - size_t versions of above +** %Id, %Io, %Iu, %Ix, %IX - size_t versions of above (for Windows compat) +** You should use PRI*SIZE macros instead +** %s - string ** %c - character ** %p - pointer (deals with machine dependent pointer size) ** %f - float @@ -37,7 +39,8 @@ ** buffer on success, nullptr on failure. Call "JS_smprintf_free" to release ** the memory returned. */ -extern JS_PUBLIC_API(char*) JS_smprintf(const char* fmt, ...); +extern JS_PUBLIC_API(char*) JS_smprintf(const char* fmt, ...) + MOZ_FORMAT_PRINTF(1, 2); /* ** Free the memory allocated, for the caller, by JS_smprintf @@ -51,7 +54,8 @@ extern JS_PUBLIC_API(void) JS_smprintf_free(char* mem); ** will allocate the initial string. The return value is the new value of ** last for subsequent calls, or nullptr if there is a malloc failure. */ -extern JS_PUBLIC_API(char*) JS_sprintf_append(char* last, const char* fmt, ...); +extern JS_PUBLIC_API(char*) JS_sprintf_append(char* last, const char* fmt, ...) + MOZ_FORMAT_PRINTF(2, 3); /* ** va_list forms of the above. diff --git a/js/src/moz.build b/js/src/moz.build index 8f830f6caebc..a0b563b9e4e6 100644 --- a/js/src/moz.build +++ b/js/src/moz.build @@ -783,7 +783,7 @@ if CONFIG['JS_HAS_CTYPES']: DEFINES['FFI_BUILDING'] = True if CONFIG['GNU_CXX']: - CXXFLAGS += ['-Wno-shadow'] + CXXFLAGS += ['-Wno-shadow', '-Werror=format'] # Suppress warnings in third-party code. if CONFIG['CLANG_CXX']: diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index b53af7be407e..e120b17c293c 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -5232,7 +5232,7 @@ ReflectTrackedOptimizations(JSContext* cx, unsigned argc, Value* vp) uint8_t* addr = ion->method()->raw() + endOffset; entry.youngestFrameLocationAtAddr(rt, addr, &script, &pc); - if (!sp.jsprintf("{\"location\":\"%s:%u\",\"offset\":%u,\"index\":%u}%s", + if (!sp.jsprintf("{\"location\":\"%s:%" PRIuSIZE "\",\"offset\":%" PRIuSIZE ",\"index\":%u}%s", script->filename(), script->lineno(), script->pcToOffset(pc), index, iter.more() ? "," : "")) { diff --git a/js/src/shell/jsoptparse.cpp b/js/src/shell/jsoptparse.cpp index 5e1a3aa09fdc..eaf4042d3bf4 100644 --- a/js/src/shell/jsoptparse.cpp +++ b/js/src/shell/jsoptparse.cpp @@ -264,7 +264,7 @@ OptionParser::extractValue(size_t argc, char** argv, size_t* i, char** value) if (eq) { *value = eq + 1; if (*value[0] == '\0') - return error("A value is required for option %.*s", eq - argv[*i], argv[*i]); + return error("A value is required for option %.*s", (int) (eq - argv[*i]), argv[*i]); return Okay; } diff --git a/js/src/shell/jsoptparse.h b/js/src/shell/jsoptparse.h index b2a24348186a..274978130ea3 100644 --- a/js/src/shell/jsoptparse.h +++ b/js/src/shell/jsoptparse.h @@ -228,7 +228,7 @@ class OptionParser Option* findArgument(const char* name); const Option* findArgument(const char* name) const; - Result error(const char* fmt, ...); + Result error(const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3); Result extractValue(size_t argc, char** argv, size_t* i, char** value); Result handleArg(size_t argc, char** argv, size_t* i, bool* optsAllowed); Result handleOption(Option* opt, size_t argc, char** argv, size_t* i, bool* optsAllowed); diff --git a/js/src/shell/moz.build b/js/src/shell/moz.build index 77475b241fa8..72ea8145cc31 100644 --- a/js/src/shell/moz.build +++ b/js/src/shell/moz.build @@ -51,7 +51,7 @@ shellmoduleloader.inputs = [ ] if CONFIG['GNU_CXX']: - CXXFLAGS += ['-Wno-shadow'] + CXXFLAGS += ['-Wno-shadow', '-Werror=format'] # This is intended as a temporary workaround to enable VS2015. if CONFIG['_MSC_VER']: diff --git a/js/src/vm/CodeCoverage.cpp b/js/src/vm/CodeCoverage.cpp index 280256b66eef..e7146a32a3be 100644 --- a/js/src/vm/CodeCoverage.cpp +++ b/js/src/vm/CodeCoverage.cpp @@ -91,16 +91,16 @@ LCovSource::exportInto(GenericPrinter& out) const outFN_.exportInto(out); outFNDA_.exportInto(out); - out.printf("FNF:%d\n", numFunctionsFound_); - out.printf("FNH:%d\n", numFunctionsHit_); + out.printf("FNF:%" PRIuSIZE "\n", numFunctionsFound_); + out.printf("FNH:%" PRIuSIZE "\n", numFunctionsHit_); outBRDA_.exportInto(out); - out.printf("BRF:%d\n", numBranchesFound_); - out.printf("BRH:%d\n", numBranchesHit_); + out.printf("BRF:%" PRIuSIZE "\n", numBranchesFound_); + out.printf("BRH:%" PRIuSIZE "\n", numBranchesHit_); outDA_.exportInto(out); - out.printf("LF:%d\n", numLinesInstrumented_); - out.printf("LH:%d\n", numLinesHit_); + out.printf("LF:%" PRIuSIZE "\n", numLinesInstrumented_); + out.printf("LH:%" PRIuSIZE "\n", numLinesHit_); out.put("end_of_record\n"); } @@ -130,7 +130,7 @@ bool LCovSource::writeScript(JSScript* script) { numFunctionsFound_++; - outFN_.printf("FN:%d,", script->lineno()); + outFN_.printf("FN:%" PRIuSIZE ",", script->lineno()); if (!writeScriptName(outFN_, script)) return false; outFN_.put("\n", 1); @@ -191,7 +191,7 @@ LCovSource::writeScript(JSScript* script) } if (oldLine != lineno && fallsthrough) { - outDA_.printf("DA:%d,%" PRIu64 "\n", lineno, hits); + outDA_.printf("DA:%" PRIuSIZE ",%" PRIu64 "\n", lineno, hits); // Count the number of lines instrumented & hit. numLinesInstrumented_++; @@ -220,13 +220,13 @@ LCovSource::writeScript(JSScript* script) } uint64_t taken = hits - fallthroughHits; - outBRDA_.printf("BRDA:%d,%d,0,", lineno, branchId); + outBRDA_.printf("BRDA:%" PRIuSIZE ",%" PRIuSIZE ",0,", lineno, branchId); if (taken) outBRDA_.printf("%" PRIu64 "\n", taken); else outBRDA_.put("-\n", 2); - outBRDA_.printf("BRDA:%d,%d,1,", lineno, branchId); + outBRDA_.printf("BRDA:%" PRIuSIZE ",%" PRIuSIZE ",1,", lineno, branchId); if (fallthroughHits) outBRDA_.printf("%" PRIu64 "\n", fallthroughHits); else @@ -308,7 +308,8 @@ LCovSource::writeScript(JSScript* script) caseHits -= fallsThroughHits; } - outBRDA_.printf("BRDA:%d,%d,%d,", lineno, branchId, caseId); + outBRDA_.printf("BRDA:%" PRIuSIZE ",%" PRIuSIZE ",%" PRIuSIZE ",", + lineno, branchId, caseId); if (caseHits) outBRDA_.printf("%" PRIu64 "\n", caseHits); else @@ -359,7 +360,8 @@ LCovSource::writeScript(JSScript* script) } if (defaultHasOwnClause) { - outBRDA_.printf("BRDA:%d,%d,%d,", lineno, branchId, caseId); + outBRDA_.printf("BRDA:%" PRIuSIZE ",%" PRIuSIZE ",%" PRIuSIZE ",", + lineno, branchId, caseId); if (defaultHits) outBRDA_.printf("%" PRIu64 "\n", defaultHits); else diff --git a/js/src/vm/Printer.h b/js/src/vm/Printer.h index ae70d59fa114..3ee76da44d5e 100644 --- a/js/src/vm/Printer.h +++ b/js/src/vm/Printer.h @@ -43,7 +43,7 @@ class GenericPrinter } // Prints a formatted string into the buffer. - virtual int printf(const char* fmt, ...); + virtual int printf(const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3); virtual int vprintf(const char* fmt, va_list ap); // Report that a string operation failed to get the memory it requested. The @@ -115,7 +115,7 @@ class Sprinter final : public GenericPrinter // Format the given format/arguments as if by JS_vsmprintf, then put it. // Return true on success, else return false and report an error (typically // OOM). - MOZ_MUST_USE bool jsprintf(const char* fmt, ...); + MOZ_MUST_USE bool jsprintf(const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3); // Prints a formatted string into the buffer. virtual int vprintf(const char* fmt, va_list ap) override; @@ -157,7 +157,7 @@ class Fprinter final : public GenericPrinter using GenericPrinter::put; // pick up |inline int put(const char* s);| // Prints a formatted string into the buffer. - virtual int printf(const char* fmt, ...) override; + virtual int printf(const char* fmt, ...) override MOZ_FORMAT_PRINTF(2, 3); virtual int vprintf(const char* fmt, va_list ap) override; }; @@ -203,7 +203,7 @@ class LSprinter final : public GenericPrinter using GenericPrinter::put; // pick up |inline int put(const char* s);| // Prints a formatted string into the buffer. - virtual int printf(const char* fmt, ...) override; + virtual int printf(const char* fmt, ...) override MOZ_FORMAT_PRINTF(2, 3); virtual int vprintf(const char* fmt, va_list ap) override; // Report that a string operation failed to get the memory it requested. The diff --git a/js/src/vm/TraceLoggingGraph.cpp b/js/src/vm/TraceLoggingGraph.cpp index 16d270b7e54a..6f6792e98040 100644 --- a/js/src/vm/TraceLoggingGraph.cpp +++ b/js/src/vm/TraceLoggingGraph.cpp @@ -50,6 +50,7 @@ TraceLoggerGraphState* traceLoggerGraphState = nullptr; // are allowed, with %u standing for a full 32-bit number and %d standing for // an up to 3-digit number. static js::UniqueChars +MOZ_FORMAT_PRINTF(1, 2) AllocTraceLogFilename(const char* pattern, ...) { js::UniqueChars filename; diff --git a/js/src/vm/TypeInference.cpp b/js/src/vm/TypeInference.cpp index 97a92fccee95..762edf71d3a5 100644 --- a/js/src/vm/TypeInference.cpp +++ b/js/src/vm/TypeInference.cpp @@ -237,6 +237,7 @@ js::InferSpewImpl(const char* fmt, ...) #endif MOZ_NORETURN MOZ_COLD static void +MOZ_FORMAT_PRINTF(2, 3) TypeFailure(JSContext* cx, const char* fmt, ...) { char msgbuf[1024]; /* Larger error messages will be truncated */ @@ -3288,7 +3289,7 @@ js::TypeMonitorResult(JSContext* cx, JSScript* script, jsbytecode* pc, TypeSet:: if (types->hasType(type)) return; - InferSpew(ISpewOps, "bytecodeType: %p %05u: %s", + InferSpew(ISpewOps, "bytecodeType: %p %05" PRIuSIZE ": %s", script, script->pcToOffset(pc), TypeSet::TypeString(type)); types->addType(cx, type); } diff --git a/js/src/vm/TypeInference.h b/js/src/vm/TypeInference.h index ee243bf299f0..26522727c98f 100644 --- a/js/src/vm/TypeInference.h +++ b/js/src/vm/TypeInference.h @@ -1296,7 +1296,7 @@ const char * InferSpewColor(TypeConstraint* constraint); const char * InferSpewColor(TypeSet* types); #define InferSpew(channel, ...) if (InferSpewActive(channel)) { InferSpewImpl(__VA_ARGS__); } else {} -void InferSpewImpl(const char* fmt, ...); +void InferSpewImpl(const char* fmt, ...) MOZ_FORMAT_PRINTF(1, 2); /* Check that the type property for id in group contains value. */ bool ObjectGroupHasProperty(JSContext* cx, ObjectGroup* group, jsid id, const Value& value); diff --git a/js/xpconnect/loader/mozJSComponentLoader.cpp b/js/xpconnect/loader/mozJSComponentLoader.cpp index 2f0c0ff40a56..95c214867758 100644 --- a/js/xpconnect/loader/mozJSComponentLoader.cpp +++ b/js/xpconnect/loader/mozJSComponentLoader.cpp @@ -154,6 +154,7 @@ private: }; static nsresult +MOZ_FORMAT_PRINTF(2, 3) ReportOnCallerUTF8(JSContext* callerContext, const char* format, ...) { if (!callerContext) { @@ -177,6 +178,7 @@ ReportOnCallerUTF8(JSContext* callerContext, } static nsresult +MOZ_FORMAT_PRINTF(2, 3) ReportOnCallerUTF8(JSCLContextHelper& helper, const char* format, ...) { diff --git a/js/xpconnect/src/XPCThrower.cpp b/js/xpconnect/src/XPCThrower.cpp index ad479b4e3eb8..4a37e1554287 100644 --- a/js/xpconnect/src/XPCThrower.cpp +++ b/js/xpconnect/src/XPCThrower.cpp @@ -116,9 +116,9 @@ XPCThrower::ThrowBadResult(nsresult rv, nsresult result, XPCCallContext& ccx) format = ""; if (nsXPCException::NameAndFormatForNSResult(result, &name, nullptr) && name) - sz = JS_smprintf("%s 0x%x (%s)", format, result, name); + sz = JS_smprintf("%s 0x%x (%s)", format, (unsigned) result, name); else - sz = JS_smprintf("%s 0x%x", format, result); + sz = JS_smprintf("%s 0x%x", format, (unsigned) result); NS_ENSURE_TRUE_VOID(sz); if (sz && sVerbose) diff --git a/js/xpconnect/src/XPCWrappedJSClass.cpp b/js/xpconnect/src/XPCWrappedJSClass.cpp index 518c8c94ce62..0cf82633c6c9 100644 --- a/js/xpconnect/src/XPCWrappedJSClass.cpp +++ b/js/xpconnect/src/XPCWrappedJSClass.cpp @@ -971,7 +971,7 @@ nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS* wrapper, uint16_t methodIndex, const char* str = "IDL methods marked with [implicit_jscontext] " "or [optional_argc] may not be implemented in JS"; // Throw and warn for good measure. - JS_ReportErrorASCII(cx, str); + JS_ReportErrorASCII(cx, "%s", str); NS_WARNING(str); return CheckForException(ccx, aes, name, GetInterfaceName()); } diff --git a/js/xpconnect/src/moz.build b/js/xpconnect/src/moz.build index 9108fd66aca2..94d58577cc79 100644 --- a/js/xpconnect/src/moz.build +++ b/js/xpconnect/src/moz.build @@ -72,4 +72,4 @@ if CONFIG['MOZ_B2G_BT']: ] if CONFIG['GNU_CXX']: - CXXFLAGS += ['-Wno-shadow'] + CXXFLAGS += ['-Wno-shadow', '-Werror=format'] diff --git a/js/xpconnect/wrappers/AccessCheck.cpp b/js/xpconnect/wrappers/AccessCheck.cpp index 66e96d04c34a..9f468931f197 100644 --- a/js/xpconnect/wrappers/AccessCheck.cpp +++ b/js/xpconnect/wrappers/AccessCheck.cpp @@ -274,7 +274,7 @@ static void EnterAndThrowASCII(JSContext* cx, JSObject* wrapper, const char* msg) { JSAutoCompartment ac(cx, wrapper); - JS_ReportErrorASCII(cx, msg); + JS_ReportErrorASCII(cx, "%s", msg); } bool