+static inline void
+out_two (int data)
+{
+ md_number_to_chars (frag_more (2), data, 2);
+}
+
+/* Emit a four byte word into the current segment. */
+
+static inline void
+out_four (int data)
+{
+ md_number_to_chars (frag_more (4), data, 4);
+}
+
+/* Emit an unsigned "little-endian base 128" number. */
+
+static void
+out_uleb128 (addressT value)
+{
+ output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
+}
+
+/* Emit an unsigned "little-endian base 128" number. */
+
+static void
+out_sleb128 (offsetT value)
+{
+ output_leb128 (frag_more (sizeof_leb128 (value, 1)), value, 1);
+}
+
+static unsigned int
+encoding_size (unsigned char encoding)
+{
+ if (encoding == DW_EH_PE_omit)
+ return 0;
+ switch (encoding & 0x7)
+ {
+ case 0:
+ return bfd_get_arch_size (stdoutput) == 64 ? 8 : 4;
+ case DW_EH_PE_udata2:
+ return 2;
+ case DW_EH_PE_udata4:
+ return 4;
+ case DW_EH_PE_udata8:
+ return 8;
+ default:
+ abort ();
+ }
+}
+
+/* Emit expression EXP in ENCODING. If EMIT_ENCODING is true, first
+ emit a byte containing ENCODING. */
+
+static void
+emit_expr_encoded (expressionS *exp, int encoding, bfd_boolean emit_encoding)
+{
+ unsigned int size = encoding_size (encoding);
+ bfd_reloc_code_real_type code;
+
+ if (encoding == DW_EH_PE_omit)
+ return;
+
+ if (emit_encoding)
+ out_one (encoding);
+
+ code = tc_cfi_reloc_for_encoding (encoding);
+ if (code != BFD_RELOC_NONE)
+ {
+ reloc_howto_type *howto = bfd_reloc_type_lookup (stdoutput, code);
+ char *p = frag_more (size);
+ gas_assert (size == (unsigned) howto->bitsize / 8);
+ md_number_to_chars (p, 0, size);
+ fix_new (frag_now, p - frag_now->fr_literal, size, exp->X_add_symbol,
+ exp->X_add_number, howto->pc_relative, code);
+ }
+ else if ((encoding & 0x70) == DW_EH_PE_pcrel)
+ {
+#if CFI_DIFF_EXPR_OK
+ expressionS tmp = *exp;
+ tmp.X_op = O_subtract;
+ tmp.X_op_symbol = symbol_temp_new_now ();
+ emit_expr (&tmp, size);
+#elif defined (tc_cfi_emit_pcrel_expr)
+ tc_cfi_emit_pcrel_expr (exp, size);
+#else
+ abort ();
+#endif
+ }
+ else
+ emit_expr (exp, size);
+}
+\f