bool BinOutput::ConvertValueToBytes(Value& value, Location loc, NumericOutput& num_out) { // Binary objects we need to resolve against object, not against section. if (value.isRelative()) { Location label_loc; IntNum ssymval; Expr syme; SymbolRef rel = value.getRelative(); if (rel->isAbsoluteSymbol()) syme = Expr(0); else if (rel->getLabel(&label_loc) && label_loc.bc->getContainer()) syme = Expr(rel); else if (getBinSSymValue(*rel, &ssymval)) syme = Expr(ssymval); else goto done; // Handle PC-relative if (value.getSubLocation(&label_loc) && label_loc.bc->getContainer()) syme -= label_loc; // Add into absolute portion value.AddAbs(syme); value.ClearRelative(); } done: // Simplify absolute portion of value, transforming symrecs if (Expr* abs = value.getAbs()) { BinSimplify(*abs); abs->Simplify(getDiagnostics()); } // Output IntNum intn; m_object.getArch()->setEndian(num_out.getBytes()); if (value.OutputBasic(num_out, &intn, getDiagnostics())) return true; // Couldn't output, assume it contains an external reference. Diag(value.getSource().getBegin(), diag::err_bin_extern_ref); return false; }