diff options
author | Refael Ackermann <refack@gmail.com> | 2014-09-29 13:20:04 +0400 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2014-10-08 15:44:38 +0400 |
commit | 9116b240c924d37627313416b7ee038d0580afbc (patch) | |
tree | 86c586915a96d308b1b04de679a8ae293caf3e41 /deps/v8/src/arm/disasm-arm.cc | |
parent | a2a3fd48934f36d94575dd33d2a2cb732f937f77 (diff) | |
download | node-9116b240c924d37627313416b7ee038d0580afbc.tar.gz |
deps: update v8 to 3.28.73
Reviewed-By: Fedor Indutny <fedor@indutny.com>
PR-URL: https://github.com/joyent/node/pull/8476
Diffstat (limited to 'deps/v8/src/arm/disasm-arm.cc')
-rw-r--r-- | deps/v8/src/arm/disasm-arm.cc | 243 |
1 files changed, 121 insertions, 122 deletions
diff --git a/deps/v8/src/arm/disasm-arm.cc b/deps/v8/src/arm/disasm-arm.cc index 0a5d5b0d3..85977b186 100644 --- a/deps/v8/src/arm/disasm-arm.cc +++ b/deps/v8/src/arm/disasm-arm.cc @@ -24,18 +24,18 @@ #include <assert.h> -#include <stdio.h> #include <stdarg.h> +#include <stdio.h> #include <string.h> -#include "v8.h" +#include "src/v8.h" #if V8_TARGET_ARCH_ARM -#include "constants-arm.h" -#include "disasm.h" -#include "macro-assembler.h" -#include "platform.h" +#include "src/arm/constants-arm.h" +#include "src/base/platform/platform.h" +#include "src/disasm.h" +#include "src/macro-assembler.h" namespace v8 { @@ -207,15 +207,15 @@ void Decoder::PrintShiftRm(Instruction* instr) { } else if (((shift == LSR) || (shift == ASR)) && (shift_amount == 0)) { shift_amount = 32; } - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - ", %s #%d", - shift_names[shift_index], - shift_amount); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + ", %s #%d", + shift_names[shift_index], + shift_amount); } else { // by register int rs = instr->RsValue(); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - ", %s ", shift_names[shift_index]); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + ", %s ", shift_names[shift_index]); PrintRegister(rs); } } @@ -227,8 +227,7 @@ void Decoder::PrintShiftImm(Instruction* instr) { int rotate = instr->RotateValue() * 2; int immed8 = instr->Immed8Value(); int imm = (immed8 >> rotate) | (immed8 << (32 - rotate)); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "#%d", imm); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "#%d", imm); } @@ -236,10 +235,10 @@ void Decoder::PrintShiftImm(Instruction* instr) { void Decoder::PrintShiftSat(Instruction* instr) { int shift = instr->Bits(11, 7); if (shift > 0) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - ", %s #%d", - shift_names[instr->Bit(6) * 2], - instr->Bits(11, 7)); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + ", %s #%d", + shift_names[instr->Bit(6) * 2], + instr->Bits(11, 7)); } } @@ -283,14 +282,14 @@ void Decoder::PrintSoftwareInterrupt(SoftwareInterruptCodes svc) { return; default: if (svc >= kStopCode) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "%d - 0x%x", - svc & kStopCodeMask, - svc & kStopCodeMask); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "%d - 0x%x", + svc & kStopCodeMask, + svc & kStopCodeMask); } else { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "%d", - svc); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "%d", + svc); } return; } @@ -300,7 +299,7 @@ void Decoder::PrintSoftwareInterrupt(SoftwareInterruptCodes svc) { // Handle all register based formatting in this function to reduce the // complexity of FormatOption. int Decoder::FormatRegister(Instruction* instr, const char* format) { - ASSERT(format[0] == 'r'); + DCHECK(format[0] == 'r'); if (format[1] == 'n') { // 'rn: Rn register int reg = instr->RnValue(); PrintRegister(reg); @@ -323,7 +322,7 @@ int Decoder::FormatRegister(Instruction* instr, const char* format) { return 2; } else if (format[1] == 'l') { // 'rlist: register list for load and store multiple instructions - ASSERT(STRING_STARTS_WITH(format, "rlist")); + DCHECK(STRING_STARTS_WITH(format, "rlist")); int rlist = instr->RlistValue(); int reg = 0; Print("{"); @@ -349,7 +348,7 @@ int Decoder::FormatRegister(Instruction* instr, const char* format) { // Handle all VFP register based formatting in this function to reduce the // complexity of FormatOption. int Decoder::FormatVFPRegister(Instruction* instr, const char* format) { - ASSERT((format[0] == 'S') || (format[0] == 'D')); + DCHECK((format[0] == 'S') || (format[0] == 'D')); VFPRegPrecision precision = format[0] == 'D' ? kDoublePrecision : kSinglePrecision; @@ -399,35 +398,35 @@ int Decoder::FormatVFPinstruction(Instruction* instr, const char* format) { void Decoder::FormatNeonList(int Vd, int type) { if (type == nlt_1) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "{d%d}", Vd); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "{d%d}", Vd); } else if (type == nlt_2) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "{d%d, d%d}", Vd, Vd + 1); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "{d%d, d%d}", Vd, Vd + 1); } else if (type == nlt_3) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "{d%d, d%d, d%d}", Vd, Vd + 1, Vd + 2); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "{d%d, d%d, d%d}", Vd, Vd + 1, Vd + 2); } else if (type == nlt_4) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "{d%d, d%d, d%d, d%d}", Vd, Vd + 1, Vd + 2, Vd + 3); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "{d%d, d%d, d%d, d%d}", Vd, Vd + 1, Vd + 2, Vd + 3); } } void Decoder::FormatNeonMemory(int Rn, int align, int Rm) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "[r%d", Rn); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "[r%d", Rn); if (align != 0) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - ":%d", (1 << align) << 6); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + ":%d", (1 << align) << 6); } if (Rm == 15) { Print("]"); } else if (Rm == 13) { Print("]!"); } else { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "], r%d", Rm); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "], r%d", Rm); } } @@ -437,8 +436,7 @@ void Decoder::PrintMovwMovt(Instruction* instr) { int imm = instr->ImmedMovwMovtValue(); int rd = instr->RdValue(); PrintRegister(rd); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - ", #%d", imm); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, ", #%d", imm); } @@ -464,14 +462,13 @@ int Decoder::FormatOption(Instruction* instr, const char* format) { return 1; } case 'c': { // 'cond: conditional execution - ASSERT(STRING_STARTS_WITH(format, "cond")); + DCHECK(STRING_STARTS_WITH(format, "cond")); PrintCondition(instr); return 4; } case 'd': { // 'd: vmov double immediate. double d = instr->DoubleImmedVmov(); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "#%g", d); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "#%g", d); return 1; } case 'f': { // 'f: bitfield instructions - v7 and above. @@ -481,11 +478,11 @@ int Decoder::FormatOption(Instruction* instr, const char* format) { // BFC/BFI: // Bits 20-16 represent most-significant bit. Covert to width. width -= lsbit; - ASSERT(width > 0); + DCHECK(width > 0); } - ASSERT((width + lsbit) <= 32); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "#%d, #%d", lsbit, width); + DCHECK((width + lsbit) <= 32); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "#%d, #%d", lsbit, width); return 1; } case 'h': { // 'h: halfword operation for extra loads and stores @@ -501,13 +498,13 @@ int Decoder::FormatOption(Instruction* instr, const char* format) { int width = (format[3] - '0') * 10 + (format[4] - '0'); int lsb = (format[6] - '0') * 10 + (format[7] - '0'); - ASSERT((width >= 1) && (width <= 32)); - ASSERT((lsb >= 0) && (lsb <= 31)); - ASSERT((width + lsb) <= 32); + DCHECK((width >= 1) && (width <= 32)); + DCHECK((lsb >= 0) && (lsb <= 31)); + DCHECK((width + lsb) <= 32); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "%d", - instr->Bits(width + lsb - 1, lsb)); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "%d", + instr->Bits(width + lsb - 1, lsb)); return 8; } case 'l': { // 'l: branch and link @@ -523,7 +520,7 @@ int Decoder::FormatOption(Instruction* instr, const char* format) { return 2; } if (format[1] == 'e') { // 'memop: load/store instructions. - ASSERT(STRING_STARTS_WITH(format, "memop")); + DCHECK(STRING_STARTS_WITH(format, "memop")); if (instr->HasL()) { Print("ldr"); } else { @@ -541,38 +538,37 @@ int Decoder::FormatOption(Instruction* instr, const char* format) { return 5; } // 'msg: for simulator break instructions - ASSERT(STRING_STARTS_WITH(format, "msg")); + DCHECK(STRING_STARTS_WITH(format, "msg")); byte* str = reinterpret_cast<byte*>(instr->InstructionBits() & 0x0fffffff); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "%s", converter_.NameInCode(str)); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "%s", converter_.NameInCode(str)); return 3; } case 'o': { if ((format[3] == '1') && (format[4] == '2')) { // 'off12: 12-bit offset for load and store instructions - ASSERT(STRING_STARTS_WITH(format, "off12")); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "%d", instr->Offset12Value()); + DCHECK(STRING_STARTS_WITH(format, "off12")); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "%d", instr->Offset12Value()); return 5; } else if (format[3] == '0') { // 'off0to3and8to19 16-bit immediate encoded in bits 19-8 and 3-0. - ASSERT(STRING_STARTS_WITH(format, "off0to3and8to19")); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "%d", - (instr->Bits(19, 8) << 4) + - instr->Bits(3, 0)); + DCHECK(STRING_STARTS_WITH(format, "off0to3and8to19")); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "%d", + (instr->Bits(19, 8) << 4) + + instr->Bits(3, 0)); return 15; } // 'off8: 8-bit offset for extra load and store instructions - ASSERT(STRING_STARTS_WITH(format, "off8")); + DCHECK(STRING_STARTS_WITH(format, "off8")); int offs8 = (instr->ImmedHValue() << 4) | instr->ImmedLValue(); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "%d", offs8); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", offs8); return 4; } case 'p': { // 'pu: P and U bits for load and store instructions - ASSERT(STRING_STARTS_WITH(format, "pu")); + DCHECK(STRING_STARTS_WITH(format, "pu")); PrintPU(instr); return 2; } @@ -582,29 +578,29 @@ int Decoder::FormatOption(Instruction* instr, const char* format) { case 's': { if (format[1] == 'h') { // 'shift_op or 'shift_rm or 'shift_sat. if (format[6] == 'o') { // 'shift_op - ASSERT(STRING_STARTS_WITH(format, "shift_op")); + DCHECK(STRING_STARTS_WITH(format, "shift_op")); if (instr->TypeValue() == 0) { PrintShiftRm(instr); } else { - ASSERT(instr->TypeValue() == 1); + DCHECK(instr->TypeValue() == 1); PrintShiftImm(instr); } return 8; } else if (format[6] == 's') { // 'shift_sat. - ASSERT(STRING_STARTS_WITH(format, "shift_sat")); + DCHECK(STRING_STARTS_WITH(format, "shift_sat")); PrintShiftSat(instr); return 9; } else { // 'shift_rm - ASSERT(STRING_STARTS_WITH(format, "shift_rm")); + DCHECK(STRING_STARTS_WITH(format, "shift_rm")); PrintShiftRm(instr); return 8; } } else if (format[1] == 'v') { // 'svc - ASSERT(STRING_STARTS_WITH(format, "svc")); + DCHECK(STRING_STARTS_WITH(format, "svc")); PrintSoftwareInterrupt(instr->SvcValue()); return 3; } else if (format[1] == 'i') { // 'sign: signed extra loads and stores - ASSERT(STRING_STARTS_WITH(format, "sign")); + DCHECK(STRING_STARTS_WITH(format, "sign")); if (instr->HasSign()) { Print("s"); } @@ -617,13 +613,13 @@ int Decoder::FormatOption(Instruction* instr, const char* format) { return 1; } case 't': { // 'target: target of branch instructions - ASSERT(STRING_STARTS_WITH(format, "target")); + DCHECK(STRING_STARTS_WITH(format, "target")); int off = (instr->SImmed24Value() << 2) + 8; - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "%+d -> %s", - off, - converter_.NameOfAddress( - reinterpret_cast<byte*>(instr) + off)); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "%+d -> %s", + off, + converter_.NameOfAddress( + reinterpret_cast<byte*>(instr) + off)); return 6; } case 'u': { // 'u: signed or unsigned multiplies @@ -1101,13 +1097,16 @@ void Decoder::DecodeType3(Instruction* instr) { } case db_x: { if (FLAG_enable_sudiv) { - if (!instr->HasW()) { - if (instr->Bits(5, 4) == 0x1) { - if ((instr->Bit(22) == 0x0) && (instr->Bit(20) == 0x1)) { + if (instr->Bits(5, 4) == 0x1) { + if ((instr->Bit(22) == 0x0) && (instr->Bit(20) == 0x1)) { + if (instr->Bit(21) == 0x1) { + // UDIV (in V8 notation matching ARM ISA format) rn = rm/rs + Format(instr, "udiv'cond'b 'rn, 'rm, 'rs"); + } else { // SDIV (in V8 notation matching ARM ISA format) rn = rm/rs Format(instr, "sdiv'cond'b 'rn, 'rm, 'rs"); - break; } + break; } } } @@ -1184,14 +1183,14 @@ int Decoder::DecodeType7(Instruction* instr) { Format(instr, "stop'cond 'svc"); // Also print the stop message. Its address is encoded // in the following 4 bytes. - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "\n %p %08x stop message: %s", - reinterpret_cast<int32_t*>(instr - + Instruction::kInstrSize), - *reinterpret_cast<char**>(instr - + Instruction::kInstrSize), - *reinterpret_cast<char**>(instr - + Instruction::kInstrSize)); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "\n %p %08x stop message: %s", + reinterpret_cast<void*>(instr + + Instruction::kInstrSize), + *reinterpret_cast<uint32_t*>(instr + + Instruction::kInstrSize), + *reinterpret_cast<char**>(instr + + Instruction::kInstrSize)); // We have decoded 2 * Instruction::kInstrSize bytes. return 2 * Instruction::kInstrSize; } else { @@ -1251,8 +1250,8 @@ void Decoder::DecodeTypeVFP(Instruction* instr) { // vcvt.f64.s32 Dd, Dd, #<fbits> int fraction_bits = 32 - ((instr->Bits(3, 0) << 1) | instr->Bit(5)); Format(instr, "vcvt'cond.f64.s32 'Dd, 'Dd"); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - ", #%d", fraction_bits); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + ", #%d", fraction_bits); } else if (((instr->Opc2Value() >> 1) == 0x6) && (instr->Opc3Value() & 0x1)) { DecodeVCVTBetweenFloatingPointAndInteger(instr); @@ -1547,8 +1546,8 @@ void Decoder::DecodeSpecialCondition(Instruction* instr) { int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); int Vm = (instr->Bit(5) << 4) | instr->VmValue(); int imm3 = instr->Bits(21, 19); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "vmovl.s%d q%d, d%d", imm3*8, Vd, Vm); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "vmovl.s%d q%d, d%d", imm3*8, Vd, Vm); } else { Unknown(instr); } @@ -1561,8 +1560,8 @@ void Decoder::DecodeSpecialCondition(Instruction* instr) { int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); int Vm = (instr->Bit(5) << 4) | instr->VmValue(); int imm3 = instr->Bits(21, 19); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "vmovl.u%d q%d, d%d", imm3*8, Vd, Vm); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "vmovl.u%d q%d, d%d", imm3*8, Vd, Vm); } else { Unknown(instr); } @@ -1576,8 +1575,8 @@ void Decoder::DecodeSpecialCondition(Instruction* instr) { int size = instr->Bits(7, 6); int align = instr->Bits(5, 4); int Rm = instr->VmValue(); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "vst1.%d ", (1 << size) << 3); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "vst1.%d ", (1 << size) << 3); FormatNeonList(Vd, type); Print(", "); FormatNeonMemory(Rn, align, Rm); @@ -1589,8 +1588,8 @@ void Decoder::DecodeSpecialCondition(Instruction* instr) { int size = instr->Bits(7, 6); int align = instr->Bits(5, 4); int Rm = instr->VmValue(); - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "vld1.%d ", (1 << size) << 3); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "vld1.%d ", (1 << size) << 3); FormatNeonList(Vd, type); Print(", "); FormatNeonMemory(Rn, align, Rm); @@ -1604,14 +1603,14 @@ void Decoder::DecodeSpecialCondition(Instruction* instr) { int Rn = instr->Bits(19, 16); int offset = instr->Bits(11, 0); if (offset == 0) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "pld [r%d]", Rn); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "pld [r%d]", Rn); } else if (instr->Bit(23) == 0) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "pld [r%d, #-%d]", Rn, offset); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "pld [r%d, #-%d]", Rn, offset); } else { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "pld [r%d, #+%d]", Rn, offset); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "pld [r%d, #+%d]", Rn, offset); } } else { Unknown(instr); @@ -1645,26 +1644,26 @@ int Decoder::ConstantPoolSizeAt(byte* instr_ptr) { int Decoder::InstructionDecode(byte* instr_ptr) { Instruction* instr = Instruction::At(instr_ptr); // Print raw instruction bytes. - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "%08x ", - instr->InstructionBits()); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "%08x ", + instr->InstructionBits()); if (instr->ConditionField() == kSpecialCondition) { DecodeSpecialCondition(instr); return Instruction::kInstrSize; } int instruction_bits = *(reinterpret_cast<int*>(instr_ptr)); if ((instruction_bits & kConstantPoolMarkerMask) == kConstantPoolMarker) { - out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_, - "constant pool begin (length %d)", - DecodeConstantPoolLength(instruction_bits)); + out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, + "constant pool begin (length %d)", + DecodeConstantPoolLength(instruction_bits)); return Instruction::kInstrSize; } else if (instruction_bits == kCodeAgeJumpInstruction) { // The code age prologue has a constant immediatly following the jump // instruction. Instruction* target = Instruction::At(instr_ptr + Instruction::kInstrSize); DecodeType2(instr); - OS::SNPrintF(out_buffer_ + out_buffer_pos_, - " (0x%08x)", target->InstructionBits()); + SNPrintF(out_buffer_ + out_buffer_pos_, + " (0x%08x)", target->InstructionBits()); return 2 * Instruction::kInstrSize; } switch (instr->TypeValue()) { @@ -1716,7 +1715,7 @@ namespace disasm { const char* NameConverter::NameOfAddress(byte* addr) const { - v8::internal::OS::SNPrintF(tmp_buffer_, "%p", addr); + v8::internal::SNPrintF(tmp_buffer_, "%p", addr); return tmp_buffer_.start(); } |