pyodide/pyodide_build/_f2c_fixes.py

174 lines
12 KiB
Python

import re
def fix_f2c_clapack_calls(f2c_output_name: str):
"""Fix F2C CLAPACK calls
f2c compiles code with fortran linkage, which means that
strings are passed as char* plus extra length argument at
the end.
CLAPACK uses C null terminated strings.
In scipy, we build fortran linkage wrappers for all char* CLAPACK calls.
We just need to replace the calls and extern definitions in f2c generated code.
Annoyingly, we can't just patch the fortran code to use the wrapped names because f2c
has a limit of 6 character function names.
"""
# fmt: off
lapack_names = [
"lsame_", "cgbmv_", "cgemm_", "cgemv_", "chbmv_",
"chemm_", "chemv_", "cher_", "cher2_", "cher2k_", "cherk_",
"chpmv_", "chpr_", "chpr2_", "csymm_", "csyr2k_", "csyrk_",
"ctbmv_", "ctbsv_", "ctpmv_", "ctpsv_", "ctrmm_", "ctrmv_",
"ctrsm_", "ctrsv_", "dgbmv_", "dgemm_", "dgemv_", "dsbmv_",
"dspmv_", "dspr_", "dspr2_", "dsymm_", "dsymv_", "dsyr_", "dsyr2_",
"dsyr2k_", "dsyrk_", "dtbmv_", "dtbsv_", "dtpmv_", "dtpsv_",
"dtrmm_", "dtrmv_", "dtrsm_", "dtrsv_", "sgbmv_", "sgemm_",
"sgemv_", "ssbmv_", "sspmv_", "sspr_", "sspr2_", "ssymm_",
"ssymv_", "ssyr_", "ssyr2_", "ssyr2k_", "ssyrk_", "stbmv_",
"stbsv_", "stpmv_", "stpsv_", "strmm_", "strmv_", "strsm_",
"strsv_", "zgbmv_", "zgemm_", "zgemv_", "zhbmv_", "zhemm_",
"zhemv_", "zher_", "zher2_", "zher2k_", "zherk_", "zhpmv_",
"zhpr_", "zhpr2_", "zsymm_", "zsyr2k_", "zsyrk_", "ztbmv_",
"ztbsv_", "ztpmv_", "ztpsv_", "ztrmm_", "ztrmv_", "ztrsm_",
"ztrsv_", "clangb_", "clange_", "clangt_", "clanhb_", "clanhe_",
"clanhp_", "clanhs_", "clanht_", "clansb_", "clansp_", "clansy_",
"clantb_", "clantp_", "clantr_", "dlamch_", "dlangb_", "dlange_",
"dlangt_", "dlanhs_", "dlansb_", "dlansp_", "dlanst_", "dlansy_",
"dlantb_", "dlantp_", "dlantr_", "slamch_", "slangb_", "slange_",
"slangt_", "slanhs_", "slansb_", "slansp_", "slanst_", "slansy_",
"slantb_", "slantp_", "slantr_", "zlangb_", "zlange_", "zlangt_",
"zlanhb_", "zlanhe_", "zlanhp_", "zlanhs_", "zlanht_", "zlansb_",
"zlansp_", "zlansy_", "zlantb_", "zlantp_", "zlantr_", "cbdsqr_",
"cgbbrd_", "cgbcon_", "cgbrfs_", "cgbsvx_", "cgbtrs_", "cgebak_",
"cgebal_", "cgecon_", "cgees_", "cgeesx_", "cgeev_", "cgeevx_",
"cgels_", "cgerfs_", "cgesdd_", "cgesvd_", "cgesvx_", "cgetrs_",
"cggbak_", "cggbal_", "cgges_", "cggesx_", "cggev_", "cggevx_",
"cgghrd_", "cgtcon_", "cgtrfs_", "cgtsvx_", "cgttrs_", "chbev_",
"chbevd_", "chbevx_", "chbgst_", "chbgv_", "chbgvd_", "chbgvx_",
"chbtrd_", "checon_", "cheev_", "cheevd_", "cheevr_", "cheevx_",
"chegs2_", "chegst_", "chegv_", "chegvd_", "chegvx_", "cherfs_",
"chesv_", "chesvx_", "chetd2_", "chetf2_", "chetrd_", "chetrf_",
"chetri_", "chetrs_", "chgeqz_", "chpcon_", "chpev_", "chpevd_",
"chpevx_", "chpgst_", "chpgv_", "chpgvd_", "chpgvx_", "chprfs_",
"chpsv_", "chpsvx_", "chptrd_", "chptrf_", "chptri_", "chptrs_",
"chsein_", "chseqr_", "clacp2_", "clacpy_", "clagtm_", "clahef_",
"clalsd_", "claqgb_", "claqge_", "claqhb_", "claqhe_", "claqhp_",
"claqsb_", "claqsp_", "claqsy_", "clarf_", "clarfb_", "clarft_",
"clarfx_", "clarz_", "clarzb_", "clarzt_", "clascl_", "claset_",
"clasr_", "clasyf_", "clatbs_", "clatps_", "clatrd_", "clatrs_",
"clauu2_", "clauum_", "cpbcon_", "cpbequ_", "cpbrfs_", "cpbstf_",
"cpbsv_", "cpbsvx_", "cpbtf2_", "cpbtrf_", "cpbtrs_", "cpocon_",
"cporfs_", "cposv_", "cposvx_", "cpotf2_", "cpotrf_", "cpotri_",
"cpotrs_", "cppcon_", "cppequ_", "cpprfs_", "cppsv_", "cppsvx_",
"cpptrf_", "cpptri_", "cpptrs_", "cpteqr_", "cptrfs_", "cptsvx_",
"cpttrs_", "cspcon_", "cspmv_", "cspr_", "csprfs_", "cspsv_",
"cspsvx_", "csptrf_", "csptri_", "csptrs_", "cstedc_", "cstegr_",
"cstemr_", "csteqr_", "csycon_", "csymv_", "csyr_", "csyrfs_",
"csysv_", "csysvx_", "csytf2_", "csytrf_", "csytri_", "csytrs_",
"ctbcon_", "ctbrfs_", "ctbtrs_", "ctgevc_", "ctgsja_", "ctgsna_",
"ctgsy2_", "ctgsyl_", "ctpcon_", "ctprfs_", "ctptri_", "ctptrs_",
"ctrcon_", "ctrevc_", "ctrexc_", "ctrrfs_", "ctrsen_", "ctrsna_",
"ctrsyl_", "ctrti2_", "ctrtri_", "ctrtrs_", "cungbr_", "cungtr_",
"cunm2l_", "cunm2r_", "cunmbr_", "cunmhr_", "cunml2_", "cunmlq_",
"cunmql_", "cunmqr_", "cunmr2_", "cunmr3_", "cunmrq_", "cunmrz_",
"cunmtr_", "cupgtr_", "cupmtr_", "dbdsdc_", "dbdsqr_", "ddisna_",
"dgbbrd_", "dgbcon_", "dgbrfs_", "dgbsvx_", "dgbtrs_", "dgebak_",
"dgebal_", "dgecon_", "dgees_", "dgeesx_", "dgeev_", "dgeevx_", "dgels_",
"dgerfs_", "dgesdd_", "dgesvd_", "dgesvx_", "dgetrs_", "dggbak_",
"dggbal_", "dgges_", "dggesx_", "dggev_", "dggevx_", "dgghrd_", "dgtcon_",
"dgtrfs_", "dgtsvx_", "dgttrs_", "dhgeqz_", "dhsein_", "dhseqr_",
"dlacpy_", "dlagtm_", "dlalsd_", "dlaqgb_", "dlaqge_", "dlaqsb_",
"dlaqsp_", "dlaqsy_", "dlarf_", "dlarfb_", "dlarft_", "dlarfx_", "dlarrc_",
"dlarrd_", "dlarre_", "dlarz_", "dlarzb_", "dlarzt_", "dlascl_", "dlasdq_",
"dlaset_", "dlasr_", "dlasrt_", "dlasyf_", "dlatbs_", "dlatps_", "dlatrd_",
"dlatrs_", "dlauu2_", "dlauum_", "dopgtr_", "dopmtr_", "dorgbr_",
"dorgtr_", "dorm2l_", "dorm2r_", "dormbr_", "dormhr_", "dorml2_",
"dormlq_", "dormql_", "dormqr_", "dormr2_", "dormr3_", "dormrq_",
"dormrz_", "dormtr_", "dpbcon_", "dpbequ_", "dpbrfs_", "dpbstf_", "dpbsv_",
"dpbsvx_", "dpbtf2_", "dpbtrf_", "dpbtrs_", "dpocon_", "dporfs_", "dposv_",
"dposvx_", "dpotf2_", "dpotrf_", "dpotri_", "dpotrs_", "dppcon_",
"dppequ_", "dpprfs_", "dppsv_", "dppsvx_", "dpptrf_", "dpptri_", "dpptrs_",
"dpteqr_", "dptsvx_", "dsbev_", "dsbevd_", "dsbevx_", "dsbgst_", "dsbgv_",
"dsbgvd_", "dsbgvx_", "dsbtrd_", "dspcon_", "dspev_", "dspevd_", "dspevx_",
"dspgst_", "dspgv_", "dspgvd_", "dspgvx_", "dsprfs_", "dspsv_", "dspsvx_",
"dsptrd_", "dsptrf_", "dsptri_", "dsptrs_", "dstebz_", "dstedc_",
"dstegr_", "dstemr_", "dsteqr_", "dstev_", "dstevd_", "dstevr_", "dstevx_",
"dsycon_", "dsyev_", "dsyevd_", "dsyevr_", "dsyevx_", "dsygs2_", "dsygst_",
"dsygv_", "dsygvd_", "dsygvx_", "dsyrfs_", "dsysv_", "dsysvx_", "dsytd2_",
"dsytf2_", "dsytrd_", "dsytrf_", "dsytri_", "dsytrs_", "dtbcon_",
"dtbrfs_", "dtbtrs_", "dtgevc_", "dtgsja_", "dtgsna_", "dtgsy2_",
"dtgsyl_", "dtpcon_", "dtprfs_", "dtptri_", "dtptrs_", "dtrcon_",
"dtrevc_", "dtrexc_", "dtrrfs_", "dtrsen_", "dtrsna_", "dtrsyl_",
"dtrti2_", "dtrtri_", "dtrtrs_", "sbdsdc_", "sbdsqr_", "sdisna_",
"sgbbrd_", "sgbcon_", "sgbrfs_", "sgbsvx_", "sgbtrs_", "sgebak_",
"sgebal_", "sgecon_", "sgees_", "sgeesx_", "sgeev_", "sgeevx_", "sgels_",
"sgerfs_", "sgesdd_", "sgesvd_", "sgesvx_", "sgetrs_", "sggbak_",
"sggbal_", "sgges_", "sggesx_", "sggev_", "sggevx_", "sgghrd_", "sgtcon_",
"sgtrfs_", "sgtsvx_", "sgttrs_", "shgeqz_", "shsein_", "shseqr_",
"slacpy_", "slagtm_", "slalsd_", "slaqgb_", "slaqge_", "slaqsb_",
"slaqsp_", "slaqsy_", "slarf_", "slarfb_", "slarft_", "slarfx_", "slarrc_",
"slarrd_", "slarre_", "slarz_", "slarzb_", "slarzt_", "slascl_", "slasdq_",
"slaset_", "slasr_", "slasrt_", "slasyf_", "slatbs_", "slatps_", "slatrd_",
"slatrs_", "slauu2_", "slauum_", "sopgtr_", "sopmtr_", "sorgbr_",
"sorgtr_", "sorm2l_", "sorm2r_", "sormbr_", "sormhr_", "sorml2_",
"sormlq_", "sormql_", "sormqr_", "sormr2_", "sormr3_", "sormrq_",
"sormrz_", "sormtr_", "spbcon_", "spbequ_", "spbrfs_", "spbstf_", "spbsv_",
"spbsvx_", "spbtf2_", "spbtrf_", "spbtrs_", "spocon_", "sporfs_", "sposv_",
"sposvx_", "spotf2_", "spotrf_", "spotri_", "spotrs_", "sppcon_",
"sppequ_", "spprfs_", "sppsv_", "sppsvx_", "spptrf_", "spptri_", "spptrs_",
"spteqr_", "sptsvx_", "ssbev_", "ssbevd_", "ssbevx_", "ssbgst_", "ssbgv_",
"ssbgvd_", "ssbgvx_", "ssbtrd_", "sspcon_", "sspev_", "sspevd_", "sspevx_",
"sspgst_", "sspgv_", "sspgvd_", "sspgvx_", "ssprfs_", "sspsv_", "sspsvx_",
"ssptrd_", "ssptrf_", "ssptri_", "ssptrs_", "sstebz_", "sstedc_",
"sstegr_", "sstemr_", "ssteqr_", "sstev_", "sstevd_", "sstevr_", "sstevx_",
"ssycon_", "ssyev_", "ssyevd_", "ssyevr_", "ssyevx_", "ssygs2_", "ssygst_",
"ssygv_", "ssygvd_", "ssygvx_", "ssyrfs_", "ssysv_", "ssysvx_", "ssytd2_",
"ssytf2_", "ssytrd_", "ssytrf_", "ssytri_", "ssytrs_", "stbcon_",
"stbrfs_", "stbtrs_", "stgevc_", "stgsja_", "stgsna_", "stgsy2_",
"stgsyl_", "stpcon_", "stprfs_", "stptri_", "stptrs_", "strcon_",
"strevc_", "strexc_", "strrfs_", "strsen_", "strsna_", "strsyl_",
"strti2_", "strtri_", "strtrs_", "zbdsqr_", "zgbbrd_", "zgbcon_",
"zgbrfs_", "zgbsvx_", "zgbtrs_", "zgebak_", "zgebal_", "zgecon_", "zgees_",
"zgeesx_", "zgeev_", "zgeevx_", "zgels_", "zgerfs_", "zgesdd_", "zgesvd_",
"zgesvx_", "zgetrs_", "zggbak_", "zggbal_", "zgges_", "zggesx_", "zggev_",
"zggevx_", "zgghrd_", "zgtcon_", "zgtrfs_", "zgtsvx_", "zgttrs_", "zhbev_",
"zhbevd_", "zhbevx_", "zhbgst_", "zhbgv_", "zhbgvd_", "zhbgvx_", "zhbtrd_",
"zhecon_", "zheev_", "zheevd_", "zheevr_", "zheevx_", "zhegs2_", "zhegst_",
"zhegv_", "zhegvd_", "zhegvx_", "zherfs_", "zhesv_", "zhesvx_", "zhetd2_",
"zhetf2_", "zhetrd_", "zhetrf_", "zhetri_", "zhetrs_", "zhgeqz_",
"zhpcon_", "zhpev_", "zhpevd_", "zhpevx_", "zhpgst_", "zhpgv_", "zhpgvd_",
"zhpgvx_", "zhprfs_", "zhpsv_", "zhpsvx_", "zhptrd_", "zhptrf_", "zhptri_",
"zhptrs_", "zhsein_", "zhseqr_", "zlacp2_", "zlacpy_", "zlagtm_",
"zlahef_", "zlalsd_", "zlaqgb_", "zlaqge_", "zlaqhb_", "zlaqhe_",
"zlaqhp_", "zlaqsb_", "zlaqsp_", "zlaqsy_", "zlarf_", "zlarfb_", "zlarft_",
"zlarfx_", "zlarz_", "zlarzb_", "zlarzt_", "zlascl_", "zlaset_", "zlasr_",
"zlasyf_", "zlatbs_", "zlatps_", "zlatrd_", "zlatrs_", "zlauu2_",
"zlauum_", "zpbcon_", "zpbequ_", "zpbrfs_", "zpbstf_", "zpbsv_", "zpbsvx_",
"zpbtf2_", "zpbtrf_", "zpbtrs_", "zpocon_", "zporfs_", "zposv_", "zposvx_",
"zpotf2_", "zpotrf_", "zpotri_", "zpotrs_", "zppcon_", "zppequ_",
"zpprfs_", "zppsv_", "zppsvx_", "zpptrf_", "zpptri_", "zpptrs_", "zpteqr_",
"zptrfs_", "zptsvx_", "zpttrs_", "zspcon_", "zspmv_", "zspr_", "zsprfs_",
"zspsv_", "zspsvx_", "zsptrf_", "zsptri_", "zsptrs_", "zstedc_", "zstegr_",
"zstemr_", "zsteqr_", "zsycon_", "zsymv_", "zsyr_", "zsyrfs_", "zsysv_",
"zsysvx_", "zsytf2_", "zsytrf_", "zsytri_", "zsytrs_", "ztbcon_",
"ztbrfs_", "ztbtrs_", "ztgevc_", "ztgsja_", "ztgsna_", "ztgsy2_",
"ztgsyl_", "ztpcon_", "ztprfs_", "ztptri_", "ztptrs_", "ztrcon_",
"ztrevc_", "ztrexc_", "ztrrfs_", "ztrsen_", "ztrsna_", "ztrsyl_",
"ztrti2_", "ztrtri_", "ztrtrs_", "zungbr_", "zungtr_", "zunm2l_",
"zunm2r_", "zunmbr_", "zunmhr_", "zunml2_", "zunmlq_", "zunmql_",
"zunmqr_", "zunmr2_", "zunmr3_", "zunmrq_", "zunmrz_", "zunmtr_",
"zupgtr_", "zupmtr_", "ilaenv_",
]
# fmt: on
code = None
with open(f2c_output_name, "r") as f:
code = f.read()
for cur_name in lapack_names:
code = re.sub(rf"\b{cur_name}\b", "w" + cur_name, code)
if code:
with open(f2c_output_name, "w") as f:
f.write(code)