Print this page
12259 CTF shouldn't assume enum size
        
*** 23,33 ****
  /*
   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  /*
!  * Copyright (c) 2019, Joyent, Inc.
   */
  
  #include <sys/sysmacros.h>
  #include <sys/param.h>
  #include <sys/mman.h>
--- 23,33 ----
  /*
   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  /*
!  * Copyright 2020 Joyent, Inc.
   */
  
  #include <sys/sysmacros.h>
  #include <sys/param.h>
  #include <sys/mman.h>
*** 1244,1255 ****
          fp->ctf_flags |= LCTF_DIRTY;
  
          return (type);
  }
  
  ctf_id_t
! ctf_add_enum(ctf_file_t *fp, uint_t flag, const char *name)
  {
          ctf_hash_t *hp = &fp->ctf_enums;
          ctf_helem_t *hep = NULL;
          ctf_dtdef_t *dtd = NULL;
          ctf_id_t type = CTF_ERR;
--- 1244,1259 ----
          fp->ctf_flags |= LCTF_DIRTY;
  
          return (type);
  }
  
+ /*
+  * If size is 0, we use the standard integer size. This is almost always the
+  * case, except for packed enums.
+  */
  ctf_id_t
! ctf_add_enum(ctf_file_t *fp, uint_t flag, const char *name, size_t size)
  {
          ctf_hash_t *hp = &fp->ctf_enums;
          ctf_helem_t *hep = NULL;
          ctf_dtdef_t *dtd = NULL;
          ctf_id_t type = CTF_ERR;
*** 1270,1280 ****
--- 1274,1294 ----
                          return (CTF_ERR); /* errno is set for us */
          }
  
          VERIFY(type != CTF_ERR);
          dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_ENUM, flag, 0);
+ 
+         if (size == 0) {
                  dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int;
+         } else {
+                 if (size > CTF_MAX_SIZE) {
+                         dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
+                         dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI(size);
+                         dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO(size);
+                 } else
+                         dtd->dtd_data.ctt_size = size;
+         }
  
          /*
           * Always dirty in case we modified a forward.
           */
          fp->ctf_flags |= LCTF_DIRTY;
*** 1926,1936 ****
                  if (dst_type != CTF_ERR && dst_kind != CTF_K_FORWARD) {
                          if (ctf_enum_iter(src_fp, src_type, enumcmp, &dst) ||
                              ctf_enum_iter(dst_fp, dst_type, enumcmp, &src))
                                  return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
                  } else {
!                         dst_type = ctf_add_enum(dst_fp, flag, name);
                          if ((dst.ctb_type = dst_type) == CTF_ERR ||
                              ctf_enum_iter(src_fp, src_type, enumadd, &dst))
                                  return (CTF_ERR); /* errno is set for us */
                  }
                  break;
--- 1940,1951 ----
                  if (dst_type != CTF_ERR && dst_kind != CTF_K_FORWARD) {
                          if (ctf_enum_iter(src_fp, src_type, enumcmp, &dst) ||
                              ctf_enum_iter(dst_fp, dst_type, enumcmp, &src))
                                  return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
                  } else {
!                         size_t size = ctf_type_size(src_fp, src_type);
!                         dst_type = ctf_add_enum(dst_fp, flag, name, size);
                          if ((dst.ctb_type = dst_type) == CTF_ERR ||
                              ctf_enum_iter(src_fp, src_type, enumadd, &dst))
                                  return (CTF_ERR); /* errno is set for us */
                  }
                  break;