Skip to content

Instantly share code, notes, and snippets.

@mkrautz
Last active August 29, 2015 14:09
Show Gist options
  • Save mkrautz/a122c52f3033da12cc57 to your computer and use it in GitHub Desktop.
Save mkrautz/a122c52f3033da12cc57 to your computer and use it in GitHub Desktop.
Opus crash on MSVC 2013.3/2013.4
:: Reproducer for what seems to be a bug in MSVC 2013.3/2013.4.
::
:: The crash triggers when built with /fp:fast (http://msdn.microsoft.com/en-us/library/e7s85ffb.aspx)
:: and -Oi (http://msdn.microsoft.com/en-us/library/f99tchzc.aspx).
::
:: The compiler seems to compile the sqrt assignment loop in
:: https://git.xiph.org/?p=opus.git;a=blob;f=src/analysis.c;h=2ee853376a3e13ddcb1ffaed64f549bf858477bb;hb=HEAD#l497
:: into a series of SIMD operations, one of them being 'sqrtps'.
:: However, the output address of the generated sqrtps instruction
:: is not aligned on a 16-byte boundary. This is what causes the crash.
::
:: Drop this file (build.cmd) into the root of the Opus source
:: tree and run build.cmd.
::
:: (Make sure your command prompt is in the MSVC environment first,
:: by doing: call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x64)
set bin=%~dp0\release
del /q %bin%\*
echo "celt/bands.c" >> %bin%\sources.list
echo "celt/celt.c" >> %bin%\sources.list
echo "celt/celt_encoder.c" >> %bin%\sources.list
echo "celt/celt_decoder.c" >> %bin%\sources.list
echo "celt/cwrs.c" >> %bin%\sources.list
echo "celt/entcode.c" >> %bin%\sources.list
echo "celt/entdec.c" >> %bin%\sources.list
echo "celt/entenc.c" >> %bin%\sources.list
echo "celt/kiss_fft.c" >> %bin%\sources.list
echo "celt/laplace.c" >> %bin%\sources.list
echo "celt/mathops.c" >> %bin%\sources.list
echo "celt/mdct.c" >> %bin%\sources.list
echo "celt/modes.c" >> %bin%\sources.list
echo "celt/pitch.c" >> %bin%\sources.list
echo "celt/celt_lpc.c" >> %bin%\sources.list
echo "celt/quant_bands.c" >> %bin%\sources.list
echo "celt/rate.c" >> %bin%\sources.list
echo "celt/vq.c" >> %bin%\sources.list
echo "silk/CNG.c" >> %bin%\sources.list
echo "silk/code_signs.c" >> %bin%\sources.list
echo "silk/init_decoder.c" >> %bin%\sources.list
echo "silk/decode_core.c" >> %bin%\sources.list
echo "silk/decode_frame.c" >> %bin%\sources.list
echo "silk/decode_parameters.c" >> %bin%\sources.list
echo "silk/decode_indices.c" >> %bin%\sources.list
echo "silk/decode_pulses.c" >> %bin%\sources.list
echo "silk/decoder_set_fs.c" >> %bin%\sources.list
echo "silk/dec_API.c" >> %bin%\sources.list
echo "silk/enc_API.c" >> %bin%\sources.list
echo "silk/encode_indices.c" >> %bin%\sources.list
echo "silk/encode_pulses.c" >> %bin%\sources.list
echo "silk/gain_quant.c" >> %bin%\sources.list
echo "silk/interpolate.c" >> %bin%\sources.list
echo "silk/LP_variable_cutoff.c" >> %bin%\sources.list
echo "silk/NLSF_decode.c" >> %bin%\sources.list
echo "silk/NSQ.c" >> %bin%\sources.list
echo "silk/NSQ_del_dec.c" >> %bin%\sources.list
echo "silk/PLC.c" >> %bin%\sources.list
echo "silk/shell_coder.c" >> %bin%\sources.list
echo "silk/tables_gain.c" >> %bin%\sources.list
echo "silk/tables_LTP.c" >> %bin%\sources.list
echo "silk/tables_NLSF_CB_NB_MB.c" >> %bin%\sources.list
echo "silk/tables_NLSF_CB_WB.c" >> %bin%\sources.list
echo "silk/tables_other.c" >> %bin%\sources.list
echo "silk/tables_pitch_lag.c" >> %bin%\sources.list
echo "silk/tables_pulses_per_block.c" >> %bin%\sources.list
echo "silk/VAD.c" >> %bin%\sources.list
echo "silk/control_audio_bandwidth.c" >> %bin%\sources.list
echo "silk/quant_LTP_gains.c" >> %bin%\sources.list
echo "silk/VQ_WMat_EC.c" >> %bin%\sources.list
echo "silk/HP_variable_cutoff.c" >> %bin%\sources.list
echo "silk/NLSF_encode.c" >> %bin%\sources.list
echo "silk/NLSF_VQ.c" >> %bin%\sources.list
echo "silk/NLSF_unpack.c" >> %bin%\sources.list
echo "silk/NLSF_del_dec_quant.c" >> %bin%\sources.list
echo "silk/process_NLSFs.c" >> %bin%\sources.list
echo "silk/stereo_LR_to_MS.c" >> %bin%\sources.list
echo "silk/stereo_MS_to_LR.c" >> %bin%\sources.list
echo "silk/check_control_input.c" >> %bin%\sources.list
echo "silk/control_SNR.c" >> %bin%\sources.list
echo "silk/init_encoder.c" >> %bin%\sources.list
echo "silk/control_codec.c" >> %bin%\sources.list
echo "silk/A2NLSF.c" >> %bin%\sources.list
echo "silk/ana_filt_bank_1.c" >> %bin%\sources.list
echo "silk/biquad_alt.c" >> %bin%\sources.list
echo "silk/bwexpander_32.c" >> %bin%\sources.list
echo "silk/bwexpander.c" >> %bin%\sources.list
echo "silk/debug.c" >> %bin%\sources.list
echo "silk/decode_pitch.c" >> %bin%\sources.list
echo "silk/inner_prod_aligned.c" >> %bin%\sources.list
echo "silk/lin2log.c" >> %bin%\sources.list
echo "silk/log2lin.c" >> %bin%\sources.list
echo "silk/LPC_analysis_filter.c" >> %bin%\sources.list
echo "silk/LPC_inv_pred_gain.c" >> %bin%\sources.list
echo "silk/table_LSF_cos.c" >> %bin%\sources.list
echo "silk/NLSF2A.c" >> %bin%\sources.list
echo "silk/NLSF_stabilize.c" >> %bin%\sources.list
echo "silk/NLSF_VQ_weights_laroia.c" >> %bin%\sources.list
echo "silk/pitch_est_tables.c" >> %bin%\sources.list
echo "silk/resampler.c" >> %bin%\sources.list
echo "silk/resampler_down2_3.c" >> %bin%\sources.list
echo "silk/resampler_down2.c" >> %bin%\sources.list
echo "silk/resampler_private_AR2.c" >> %bin%\sources.list
echo "silk/resampler_private_down_FIR.c" >> %bin%\sources.list
echo "silk/resampler_private_IIR_FIR.c" >> %bin%\sources.list
echo "silk/resampler_private_up2_HQ.c" >> %bin%\sources.list
echo "silk/resampler_rom.c" >> %bin%\sources.list
echo "silk/sigm_Q15.c" >> %bin%\sources.list
echo "silk/sort.c" >> %bin%\sources.list
echo "silk/sum_sqr_shift.c" >> %bin%\sources.list
echo "silk/stereo_decode_pred.c" >> %bin%\sources.list
echo "silk/stereo_encode_pred.c" >> %bin%\sources.list
echo "silk/stereo_find_predictor.c" >> %bin%\sources.list
echo "silk/stereo_quant_pred.c" >> %bin%\sources.list
echo "silk/float/apply_sine_window_FLP.c" >> %bin%\sources.list
echo "silk/float/corrMatrix_FLP.c" >> %bin%\sources.list
echo "silk/float/encode_frame_FLP.c" >> %bin%\sources.list
echo "silk/float/find_LPC_FLP.c" >> %bin%\sources.list
echo "silk/float/find_LTP_FLP.c" >> %bin%\sources.list
echo "silk/float/find_pitch_lags_FLP.c" >> %bin%\sources.list
echo "silk/float/find_pred_coefs_FLP.c" >> %bin%\sources.list
echo "silk/float/LPC_analysis_filter_FLP.c" >> %bin%\sources.list
echo "silk/float/LTP_analysis_filter_FLP.c" >> %bin%\sources.list
echo "silk/float/LTP_scale_ctrl_FLP.c" >> %bin%\sources.list
echo "silk/float/noise_shape_analysis_FLP.c" >> %bin%\sources.list
echo "silk/float/prefilter_FLP.c" >> %bin%\sources.list
echo "silk/float/process_gains_FLP.c" >> %bin%\sources.list
echo "silk/float/regularize_correlations_FLP.c" >> %bin%\sources.list
echo "silk/float/residual_energy_FLP.c" >> %bin%\sources.list
echo "silk/float/solve_LS_FLP.c" >> %bin%\sources.list
echo "silk/float/warped_autocorrelation_FLP.c" >> %bin%\sources.list
echo "silk/float/wrappers_FLP.c" >> %bin%\sources.list
echo "silk/float/autocorrelation_FLP.c" >> %bin%\sources.list
echo "silk/float/burg_modified_FLP.c" >> %bin%\sources.list
echo "silk/float/bwexpander_FLP.c" >> %bin%\sources.list
echo "silk/float/energy_FLP.c" >> %bin%\sources.list
echo "silk/float/inner_product_FLP.c" >> %bin%\sources.list
echo "silk/float/k2a_FLP.c" >> %bin%\sources.list
echo "silk/float/levinsondurbin_FLP.c" >> %bin%\sources.list
echo "silk/float/LPC_inv_pred_gain_FLP.c" >> %bin%\sources.list
echo "silk/float/pitch_analysis_core_FLP.c" >> %bin%\sources.list
echo "silk/float/scale_copy_vector_FLP.c" >> %bin%\sources.list
echo "silk/float/scale_vector_FLP.c" >> %bin%\sources.list
echo "silk/float/schur_FLP.c" >> %bin%\sources.list
echo "silk/float/sort_FLP.c" >> %bin%\sources.list
echo "src/opus.c" >> %bin%\sources.list
echo "src/opus_decoder.c" >> %bin%\sources.list
echo "src/opus_encoder.c" >> %bin%\sources.list
echo "src/opus_multistream.c" >> %bin%\sources.list
echo "src/opus_multistream_encoder.c" >> %bin%\sources.list
echo "src/opus_multistream_decoder.c" >> %bin%\sources.list
echo "src/repacketizer.c" >> %bin%\sources.list
echo "src/analysis.c" >> %bin%\sources.list
echo "src/mlp.c" >> %bin%\sources.list
echo "src/mlp_data.c" >> %bin%\sources.list
:: Ox: -Og -Oi -Ot -Oy -Ob2
:: O2: -Og -Oi -Ot -Oy -Ob2 -Gs -GF -Gy
set CFLAGS=-nologo -Zm200 -Zi -Zc:wchar_t -FS -GF -MD -GL -O2 /fp:fast -W3 -DUNICODE -DWIN32 -DWIN64 -DRESTRICT= -DHAVE_CONFIG_H -DWIN32 -D_WIN32 -DNDEBUG -Iwin32 -Icelt -Iinclude -Isilk -Isilk\float
set LFLAGS=/DEBUG /OPT:REF /OPT:ICF /NOLOGO /DYNAMICBASE /NXCOMPAT /INCREMENTAL:NO /NXCOMPAT /DYNAMICBASE /LTCG /LIBPATH:%bin%\
cl %CFLAGS% -c -Fo%bin%\ @%bin%\sources.list
del %bin%\objects.list
for %%i in (%bin%\*.obj) do echo "%%i" 1>> %bin%\objects.list
link %FLAGS% /dll /out:%bin%\opus.dll @%bin%\objects.list
cl -c %CFLAGS% -Fo%bin%\ tests\test_opus_encode.c
link %LFLAGS% /out:%bin%\test.exe opus.lib %bin%\test_opus_encode.obj
%bin%\test.exe
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment