bfd_reloc_code_real_type reloc_type;
   struct reloc_info *reloc_info = ip->reloc_info;
   size_t i;
+
   for (i = 0; i < ip->reloc_num; i++)
     {
       reloc_type = reloc_info[i].type;
     as_fatal (_("Internal error: not support relax now"));
   else
     append_fixed_insn (ip);
+
   dwarf2_emit_insn (0);
 }
 
        }
       while (0);
 
-      ret = loongarch_expand_macro (insns_buf, arg_strs, NULL, NULL);
+      ret = loongarch_expand_macro (insns_buf, arg_strs, NULL, NULL,
+                                   sizeof (args_buf));
     }
   return ret;
 }
 loongarch_assemble_INSNs (char *str)
 {
   char *rest;
+  size_t len_str = strlen(str);
 
   for (rest = str; *rest != ';' && *rest != '\0'; rest++);
   if (*rest == ';')
          char *c_str = loongarch_expand_macro (the_one.insn->macro,
                                                the_one.arg_strs,
                                                assember_macro_helper,
-                                               &the_one);
+                                               &the_one, len_str);
          loongarch_assemble_INSNs (c_str);
          free (c_str);
        }
 
     const char *format, const char *macro, const char *const arg_strs[],
     const char *(*map) (char esc1, char esc2, const char *arg),
     char *(*helper) (const char *const arg_strs[], void *context),
-    void *context);
+    void *context, size_t len_str);
   extern char *loongarch_expand_macro (
     const char *macro, const char *const arg_strs[],
     char *(*helper) (const char *const arg_strs[], void *context),
-    void *context);
+    void *context, size_t len_str);
   extern size_t loongarch_bits_imm_needed (int64_t imm, int si);
 
   extern void loongarch_eliminate_adjacent_repeat_char (char *dest, char c);
 
 loongarch_expand_macro_with_format_map (
   const char *format, const char *macro, const char *const arg_strs[],
   const char *(*map) (char esc1, char esc2, const char *arg),
-  char *(*helper) (const char *const arg_strs[], void *context), void *context)
+  char *(*helper) (const char *const arg_strs[], void *context), void *context,
+  size_t len_str)
 {
   char esc1s[MAX_ARG_NUM_PLUS_2 - 1], esc2s[MAX_ARG_NUM_PLUS_2 - 1];
   const char *bit_fields[MAX_ARG_NUM_PLUS_2 - 1];
   const char *src;
   char *dest;
-  char buffer[8192];
+
+  /* The expanded macro character length does not exceed 1000, and number of
+     label is 6 at most in the expanded macro. The len_str is the length of
+     str.  */
+  char *buffer =(char *) malloc(1024 +  6 * len_str);
 
   if (format)
     loongarch_parse_format (format, esc1s, esc2s, bit_fields);
       *dest++ = *src++;
 
   *dest = '\0';
-  return strdup (buffer);
+  return buffer;
 }
 
 char *
 loongarch_expand_macro (const char *macro, const char *const arg_strs[],
                        char *(*helper) (const char *const arg_strs[],
                                         void *context),
-                       void *context)
+                       void *context, size_t len_str)
 {
   return loongarch_expand_macro_with_format_map (NULL, macro, arg_strs, I,
-                                                helper, context);
+                                                helper, context, len_str);
 }
 
 size_t