[Ffmpeg-devel] [PATCH] build with '--enable-gprof'

Dmitry Antipov dmantipov
Thu Dec 7 14:02:22 CET 2006


Michael Niedermayer wrote:

> rejected NO further complication of the ifdefs will be accpeted, replace
> them by EBP_IS_SPECIAL and set that by a configure check which checks if
> the compiler with the current flags can use ebp

Ok. Try to look at this, but note that the check is strictly gcc-specific.
(For example, Intel C will compile it, but the resulting code is wrong and
will cause SIGSEGV. So, if the portability is important, the checking code
should be similar to the following:

#if defined(__INTEL_COMPILER)
#error "This will compile, but will not run"
#elif defined(__YOUR_FAVORITE_CC)
/* stuff */
#elif defined(__GNUC__)
int main (int argc, char *argv[])
{
   asm volatile ("mov %0, %%ebp\n\t"
                 : : "r"(argc) : "ebp");
   return 0;
}
#else
#error "Unsupported compiler"
#endif

Dmitry


Index: configure
===================================================================
--- configure	(revision 7245)
+++ configure	(working copy)
@@ -626,6 +626,7 @@
  gpl="no"
  memalign_hack="no"
  asmalign_pot="unknown"
+ebp_is_special="unknown"
  LIB_INSTALL_EXTRA_CMD='$(RANLIB) "$(libdir)/$(LIB)"'

  # OS specific
@@ -1187,7 +1188,7 @@
      fi
  fi

-if test $optimize != "no"; then
+if test $optimize != "no" && test $gprof != "yes"; then
      add_cflags "-fomit-frame-pointer"
  fi

@@ -1678,8 +1679,8 @@
  fi

  if test "$gprof" = "yes" ; then
-    add_cflags  "-p"
-    add_ldflags "-p"
+    add_cflags  "-pg"
+    add_ldflags "-pg"
  fi

  VHOOKCFLAGS="-fPIC $CFLAGS"
@@ -1691,6 +1692,19 @@
      echo 'asm (".align 3");' | check_cc && asmalign_pot="yes"
  fi

+# find if ebp may be used as a general register (x86)
+if test $arch = "x86_32" -o $arch = "x86_64"; then
+    ebp_is_special="yes"
+    check_cc <<EOF && ebp_is_special="no"
+int main (int argc, char *argv[])
+{
+  asm volatile ("mov %0, %%ebp\n\t"
+                : : "r"(argc) : "ebp");
+  return 0;
+}
+EOF
+fi
+
  echo "install prefix   $PREFIX"
  echo "source path      $source_path"
  echo "C compiler       $cc"
@@ -1947,6 +1961,7 @@
    printf '#define ASMALIGN(ZEROBITS) ".align 1<<" #ZEROBITS "\\n\\t"\n' >> $TMPH
  fi

+test "$ebp_is_special" = "yes" && echo '#define EBP_IS_SPECIAL 1' >> $TMPH

  for codec in $DECODER_LIST $ENCODER_LIST $PARSER_LIST $DEMUXER_LIST $MUXER_LIST; do
      ucname="`toupper $codec`"
Index: libavcodec/cabac.h
===================================================================
--- libavcodec/cabac.h	(revision 7245)
+++ libavcodec/cabac.h	(working copy)
@@ -376,7 +376,7 @@
  #define BYTE        "16"
  #define BYTEEND     "20"
  #endif
-#if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))
+#if defined(ARCH_X86) && !defined(EBP_IS_SPECIAL)
      int bit;

  #ifndef BRANCHLESS_CABAC_DECODER
@@ -532,7 +532,7 @@
      );
      bit&=1;
  #endif /* BRANCHLESS_CABAC_DECODER */
-#else /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */
+#else /* defined(ARCH_X86) && !defined(EBP_IS_SPECIAL) */
      int s = *state;
      int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + s];
      int bit, lps_mask attribute_unused;
@@ -571,7 +571,7 @@
      if(!(c->low & CABAC_MASK))
          refill2(c);
  #endif /* BRANCHLESS_CABAC_DECODER */
-#endif /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */
+#endif /* defined(ARCH_X86) && !defined(EBP_IS_SPECIAL) */
      return bit;
  }

@@ -632,7 +632,7 @@


  static always_inline int get_cabac_bypass_sign(CABACContext *c, int val){
-#if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))
+#if defined(ARCH_X86) && !defined(EBP_IS_SPECIAL)
      asm volatile(
          "movl "RANGE    "(%1), %%ebx            \n\t"
          "movl "LOW      "(%1), %%eax            \n\t"
@@ -680,7 +680,7 @@

  //FIXME the x86 code from this file should be moved into i386/h264 or cabac something.c/h (note ill kill you if you move my code away from under my fingers before iam finished with it!)
  //FIXME use some macros to avoid duplicatin get_cabac (cant be done yet as that would make optimization work hard)
-#if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))
+#if defined(ARCH_X86) && !defined(EBP_IS_SPECIAL)
  static int decode_significance_x86(CABACContext *c, int max_coeff, uint8_t *significant_coeff_ctx_base, int *index){
      void *end= significant_coeff_ctx_base + max_coeff - 1;
      int minusstart= -(int)significant_coeff_ctx_base;
@@ -786,7 +786,7 @@
      );
      return coeff_count;
  }
-#endif /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */
+#endif /* defined(ARCH_X86) && !defined(EBP_IS_SPECIAL) */

  /**
   *
Index: libavcodec/h264.c
===================================================================
--- libavcodec/h264.c	(revision 7245)
+++ libavcodec/h264.c	(working copy)
@@ -6027,7 +6027,7 @@
              index[coeff_count++] = last;\
          }
          const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD];
-#if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))
+#if defined(ARCH_X86) && !defined(EBP_IS_SPECIAL)
          coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index, sig_off);
      } else {
          coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index);




More information about the ffmpeg-devel mailing list