cjson
fuzzing
inputs
test1 test10 test11 test2 test3 test3.bu test3.uf test3.uu test4 test5 test6 test7 test8 test9library_config
cJSONConfig.cmake.in cJSONConfigVersion.cmake.in libcjson.pc.in libcjson_utils.pc.in uninstall.cmaketests
inputs
test1 test1.expected test10 test10.expected test11 test11.expected test2 test2.expected test3 test3.expected test4 test4.expected test5 test5.expected test6 test7 test7.expected test8 test8.expected test9 test9.expectedjson-patch-tests
.editorconfig .gitignore .npmignore README.md cjson-utils-tests.json package.json spec_tests.json tests.jsonunity
auto
colour_prompt.rb colour_reporter.rb generate_config.yml generate_module.rb generate_test_runner.rb parse_output.rb stylize_as_junit.rb test_file_filter.rb type_sanitizer.rb unity_test_summary.py unity_test_summary.rb unity_to_junit.pydocs
ThrowTheSwitchCodingStandard.md UnityAssertionsCheatSheetSuitableforPrintingandPossiblyFraming.pdf UnityAssertionsReference.md UnityConfigurationGuide.md UnityGettingStartedGuide.md UnityHelperScriptsGuide.md license.txtexamples
unity_config.hcurl
.github
scripts
cleancmd.pl cmp-config.pl cmp-pkg-config.sh codespell-ignore.words codespell.sh distfiles.sh pyspelling.words pyspelling.yaml randcurl.pl requirements-docs.txt requirements-proselint.txt requirements.txt shellcheck-ci.sh shellcheck.sh spellcheck.curl trimmarkdownheader.pl typos.sh typos.toml verify-examples.pl verify-synopsis.pl yamlcheck.sh yamlcheck.yamlworkflows
appveyor-status.yml checkdocs.yml checksrc.yml checkurls.yml codeql.yml configure-vs-cmake.yml curl-for-win.yml distcheck.yml fuzz.yml http3-linux.yml label.yml linux-old.yml linux.yml macos.yml non-native.yml windows.ymlCMake
CurlSymbolHiding.cmake CurlTests.c FindBrotli.cmake FindCares.cmake FindGSS.cmake FindGnuTLS.cmake FindLDAP.cmake FindLibbacktrace.cmake FindLibgsasl.cmake FindLibidn2.cmake FindLibpsl.cmake FindLibssh.cmake FindLibssh2.cmake FindLibuv.cmake FindMbedTLS.cmake FindNGHTTP2.cmake FindNGHTTP3.cmake FindNGTCP2.cmake FindNettle.cmake FindQuiche.cmake FindRustls.cmake FindWolfSSL.cmake FindZstd.cmake Macros.cmake OtherTests.cmake PickyWarnings.cmake Utilities.cmake cmake_uninstall.in.cmake curl-config.in.cmake unix-cache.cmake win32-cache.cmakedocs
cmdline-opts
.gitignore CMakeLists.txt MANPAGE.md Makefile.am Makefile.inc _AUTHORS.md _BUGS.md _DESCRIPTION.md _ENVIRONMENT.md _EXITCODES.md _FILES.md _GLOBBING.md _NAME.md _OPTIONS.md _OUTPUT.md _PROGRESS.md _PROTOCOLS.md _PROXYPREFIX.md _SEEALSO.md _SYNOPSIS.md _URL.md _VARIABLES.md _VERSION.md _WWW.md abstract-unix-socket.md alt-svc.md anyauth.md append.md aws-sigv4.md basic.md ca-native.md cacert.md capath.md cert-status.md cert-type.md cert.md ciphers.md compressed-ssh.md compressed.md config.md connect-timeout.md connect-to.md continue-at.md cookie-jar.md cookie.md create-dirs.md create-file-mode.md crlf.md crlfile.md curves.md data-ascii.md data-binary.md data-raw.md data-urlencode.md data.md delegation.md digest.md disable-eprt.md disable-epsv.md disable.md disallow-username-in-url.md dns-interface.md dns-ipv4-addr.md dns-ipv6-addr.md dns-servers.md doh-cert-status.md doh-insecure.md doh-url.md dump-ca-embed.md dump-header.md ech.md egd-file.md engine.md etag-compare.md etag-save.md expect100-timeout.md fail-early.md fail-with-body.md fail.md false-start.md follow.md form-escape.md form-string.md form.md ftp-account.md ftp-alternative-to-user.md ftp-create-dirs.md ftp-method.md ftp-pasv.md ftp-port.md ftp-pret.md ftp-skip-pasv-ip.md ftp-ssl-ccc-mode.md ftp-ssl-ccc.md ftp-ssl-control.md get.md globoff.md happy-eyeballs-timeout-ms.md haproxy-clientip.md haproxy-protocol.md head.md header.md help.md hostpubmd5.md hostpubsha256.md hsts.md http0.9.md http1.0.md http1.1.md http2-prior-knowledge.md http2.md http3-only.md http3.md ignore-content-length.md insecure.md interface.md ip-tos.md ipfs-gateway.md ipv4.md ipv6.md json.md junk-session-cookies.md keepalive-cnt.md keepalive-time.md key-type.md key.md knownhosts.md krb.md libcurl.md limit-rate.md list-only.md local-port.md location-trusted.md location.md login-options.md mail-auth.md mail-from.md mail-rcpt-allowfails.md mail-rcpt.md mainpage.idx manual.md max-filesize.md max-redirs.md max-time.md metalink.md mptcp.md negotiate.md netrc-file.md netrc-optional.md netrc.md next.md no-alpn.md no-buffer.md no-clobber.md no-keepalive.md no-npn.md no-progress-meter.md no-sessionid.md noproxy.md ntlm-wb.md ntlm.md oauth2-bearer.md out-null.md output-dir.md output.md parallel-immediate.md parallel-max-host.md parallel-max.md parallel.md pass.md path-as-is.md pinnedpubkey.md post301.md post302.md post303.md preproxy.md progress-bar.md proto-default.md proto-redir.md proto.md proxy-anyauth.md proxy-basic.md proxy-ca-native.md proxy-cacert.md proxy-capath.md proxy-cert-type.md proxy-cert.md proxy-ciphers.md proxy-crlfile.md proxy-digest.md proxy-header.md proxy-http2.md proxy-insecure.md proxy-key-type.md proxy-key.md proxy-negotiate.md proxy-ntlm.md proxy-pass.md proxy-pinnedpubkey.md proxy-service-name.md proxy-ssl-allow-beast.md proxy-ssl-auto-client-cert.md proxy-tls13-ciphers.md proxy-tlsauthtype.md proxy-tlspassword.md proxy-tlsuser.md proxy-tlsv1.md proxy-user.md proxy.md proxy1.0.md proxytunnel.md pubkey.md quote.md random-file.md range.md rate.md raw.md referer.md remote-header-name.md remote-name-all.md remote-name.md remote-time.md remove-on-error.md request-target.md request.md resolve.md retry-all-errors.md retry-connrefused.md retry-delay.md retry-max-time.md retry.md sasl-authzid.md sasl-ir.md service-name.md show-error.md show-headers.md sigalgs.md silent.md skip-existing.md socks4.md socks4a.md socks5-basic.md socks5-gssapi-nec.md socks5-gssapi-service.md socks5-gssapi.md socks5-hostname.md socks5.md speed-limit.md speed-time.md ssl-allow-beast.md ssl-auto-client-cert.md ssl-no-revoke.md ssl-reqd.md ssl-revoke-best-effort.md ssl-sessions.md ssl.md sslv2.md sslv3.md stderr.md styled-output.md suppress-connect-headers.md tcp-fastopen.md tcp-nodelay.md telnet-option.md tftp-blksize.md tftp-no-options.md time-cond.md tls-earlydata.md tls-max.md tls13-ciphers.md tlsauthtype.md tlspassword.md tlsuser.md tlsv1.0.md tlsv1.1.md tlsv1.2.md tlsv1.3.md tlsv1.md tr-encoding.md trace-ascii.md trace-config.md trace-ids.md trace-time.md trace.md unix-socket.md upload-file.md upload-flags.md url-query.md url.md use-ascii.md user-agent.md user.md variable.md verbose.md version.md vlan-priority.md write-out.md xattr.mdexamples
.checksrc .gitignore 10-at-a-time.c CMakeLists.txt Makefile.am Makefile.example Makefile.inc README.md adddocsref.pl address-scope.c altsvc.c anyauthput.c block_ip.c cacertinmem.c certinfo.c chkspeed.c connect-to.c cookie_interface.c crawler.c debug.c default-scheme.c ephiperfifo.c evhiperfifo.c externalsocket.c fileupload.c ftp-delete.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c ftpsget.c ftpupload.c ftpuploadfrommem.c ftpuploadresume.c getinfo.c getinmemory.c getredirect.c getreferrer.c ghiper.c headerapi.c hiperfifo.c hsts-preload.c htmltidy.c htmltitle.cpp http-options.c http-post.c http2-download.c http2-pushinmemory.c http2-serverpush.c http2-upload.c http3-present.c http3.c httpcustomheader.c httpput-postfields.c httpput.c https.c imap-append.c imap-authzid.c imap-copy.c imap-create.c imap-delete.c imap-examine.c imap-fetch.c imap-list.c imap-lsub.c imap-multi.c imap-noop.c imap-search.c imap-ssl.c imap-store.c imap-tls.c interface.c ipv6.c keepalive.c localport.c log_failed_transfers.c maxconnects.c multi-app.c multi-debugcallback.c multi-double.c multi-event.c multi-formadd.c multi-legacy.c multi-post.c multi-single.c multi-uv.c netrc.c parseurl.c persistent.c pop3-authzid.c pop3-dele.c pop3-list.c pop3-multi.c pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c pop3-tls.c pop3-top.c pop3-uidl.c post-callback.c postinmemory.c postit2-formadd.c postit2.c progressfunc.c protofeats.c range.c resolve.c rtsp-options.c sendrecv.c sepheaders.c sessioninfo.c sftpget.c sftpuploadresume.c shared-connection-cache.c simple.c simplepost.c simplessl.c smooth-gtk-thread.c smtp-authzid.c smtp-expn.c smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c smtp-tls.c smtp-vrfy.c sslbackend.c synctime.c threaded.c unixsocket.c url2file.c urlapi.c usercertinmem.c version-check.pl websocket-cb.c websocket-updown.c websocket.c xmlstream.cinternals
BUFQ.md BUFREF.md CHECKSRC.md CLIENT-READERS.md CLIENT-WRITERS.md CODE_STYLE.md CONNECTION-FILTERS.md CREDENTIALS.md CURLX.md DYNBUF.md HASH.md LLIST.md MID.md MQTT.md MULTI-EV.md NEW-PROTOCOL.md PEERS.md PORTING.md RATELIMITS.md README.md SCORECARD.md SPLAY.md STRPARSE.md THRDPOOL-AND-QUEUE.md TIME-KEEPING.md TLS-SESSIONS.md UINT_SETS.md WEBSOCKET.mdlibcurl
opts
CMakeLists.txt CURLINFO_ACTIVESOCKET.md CURLINFO_APPCONNECT_TIME.md CURLINFO_APPCONNECT_TIME_T.md CURLINFO_CAINFO.md CURLINFO_CAPATH.md CURLINFO_CERTINFO.md CURLINFO_CONDITION_UNMET.md CURLINFO_CONNECT_TIME.md CURLINFO_CONNECT_TIME_T.md CURLINFO_CONN_ID.md CURLINFO_CONTENT_LENGTH_DOWNLOAD.md CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.md CURLINFO_CONTENT_LENGTH_UPLOAD.md CURLINFO_CONTENT_LENGTH_UPLOAD_T.md CURLINFO_CONTENT_TYPE.md CURLINFO_COOKIELIST.md CURLINFO_EARLYDATA_SENT_T.md CURLINFO_EFFECTIVE_METHOD.md CURLINFO_EFFECTIVE_URL.md CURLINFO_FILETIME.md CURLINFO_FILETIME_T.md CURLINFO_FTP_ENTRY_PATH.md CURLINFO_HEADER_SIZE.md CURLINFO_HTTPAUTH_AVAIL.md CURLINFO_HTTPAUTH_USED.md CURLINFO_HTTP_CONNECTCODE.md CURLINFO_HTTP_VERSION.md CURLINFO_LASTSOCKET.md CURLINFO_LOCAL_IP.md CURLINFO_LOCAL_PORT.md CURLINFO_NAMELOOKUP_TIME.md CURLINFO_NAMELOOKUP_TIME_T.md CURLINFO_NUM_CONNECTS.md CURLINFO_OS_ERRNO.md CURLINFO_POSTTRANSFER_TIME_T.md CURLINFO_PRETRANSFER_TIME.md CURLINFO_PRETRANSFER_TIME_T.md CURLINFO_PRIMARY_IP.md CURLINFO_PRIMARY_PORT.md CURLINFO_PRIVATE.md CURLINFO_PROTOCOL.md CURLINFO_PROXYAUTH_AVAIL.md CURLINFO_PROXYAUTH_USED.md CURLINFO_PROXY_ERROR.md CURLINFO_PROXY_SSL_VERIFYRESULT.md CURLINFO_QUEUE_TIME_T.md CURLINFO_REDIRECT_COUNT.md CURLINFO_REDIRECT_TIME.md CURLINFO_REDIRECT_TIME_T.md CURLINFO_REDIRECT_URL.md CURLINFO_REFERER.md CURLINFO_REQUEST_SIZE.md CURLINFO_RESPONSE_CODE.md CURLINFO_RETRY_AFTER.md CURLINFO_RTSP_CLIENT_CSEQ.md CURLINFO_RTSP_CSEQ_RECV.md CURLINFO_RTSP_SERVER_CSEQ.md CURLINFO_RTSP_SESSION_ID.md CURLINFO_SCHEME.md CURLINFO_SIZE_DELIVERED.md CURLINFO_SIZE_DOWNLOAD.md CURLINFO_SIZE_DOWNLOAD_T.md CURLINFO_SIZE_UPLOAD.md CURLINFO_SIZE_UPLOAD_T.md CURLINFO_SPEED_DOWNLOAD.md CURLINFO_SPEED_DOWNLOAD_T.md CURLINFO_SPEED_UPLOAD.md CURLINFO_SPEED_UPLOAD_T.md CURLINFO_SSL_ENGINES.md CURLINFO_SSL_VERIFYRESULT.md CURLINFO_STARTTRANSFER_TIME.md CURLINFO_STARTTRANSFER_TIME_T.md CURLINFO_TLS_SESSION.md CURLINFO_TLS_SSL_PTR.md CURLINFO_TOTAL_TIME.md CURLINFO_TOTAL_TIME_T.md CURLINFO_USED_PROXY.md CURLINFO_XFER_ID.md CURLMINFO_XFERS_ADDED.md CURLMINFO_XFERS_CURRENT.md CURLMINFO_XFERS_DONE.md CURLMINFO_XFERS_PENDING.md CURLMINFO_XFERS_RUNNING.md CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.md CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.md CURLMOPT_MAXCONNECTS.md CURLMOPT_MAX_CONCURRENT_STREAMS.md CURLMOPT_MAX_HOST_CONNECTIONS.md CURLMOPT_MAX_PIPELINE_LENGTH.md CURLMOPT_MAX_TOTAL_CONNECTIONS.md CURLMOPT_NETWORK_CHANGED.md CURLMOPT_NOTIFYDATA.md CURLMOPT_NOTIFYFUNCTION.md CURLMOPT_PIPELINING.md CURLMOPT_PIPELINING_SERVER_BL.md CURLMOPT_PIPELINING_SITE_BL.md CURLMOPT_PUSHDATA.md CURLMOPT_PUSHFUNCTION.md CURLMOPT_QUICK_EXIT.md CURLMOPT_RESOLVE_THREADS_MAX.md CURLMOPT_SOCKETDATA.md CURLMOPT_SOCKETFUNCTION.md CURLMOPT_TIMERDATA.md CURLMOPT_TIMERFUNCTION.md CURLOPT_ABSTRACT_UNIX_SOCKET.md CURLOPT_ACCEPTTIMEOUT_MS.md CURLOPT_ACCEPT_ENCODING.md CURLOPT_ADDRESS_SCOPE.md CURLOPT_ALTSVC.md CURLOPT_ALTSVC_CTRL.md CURLOPT_APPEND.md CURLOPT_AUTOREFERER.md CURLOPT_AWS_SIGV4.md CURLOPT_BUFFERSIZE.md CURLOPT_CAINFO.md CURLOPT_CAINFO_BLOB.md CURLOPT_CAPATH.md CURLOPT_CA_CACHE_TIMEOUT.md CURLOPT_CERTINFO.md CURLOPT_CHUNK_BGN_FUNCTION.md CURLOPT_CHUNK_DATA.md CURLOPT_CHUNK_END_FUNCTION.md CURLOPT_CLOSESOCKETDATA.md CURLOPT_CLOSESOCKETFUNCTION.md CURLOPT_CONNECTTIMEOUT.md CURLOPT_CONNECTTIMEOUT_MS.md CURLOPT_CONNECT_ONLY.md CURLOPT_CONNECT_TO.md CURLOPT_CONV_FROM_NETWORK_FUNCTION.md CURLOPT_CONV_FROM_UTF8_FUNCTION.md CURLOPT_CONV_TO_NETWORK_FUNCTION.md CURLOPT_COOKIE.md CURLOPT_COOKIEFILE.md CURLOPT_COOKIEJAR.md CURLOPT_COOKIELIST.md CURLOPT_COOKIESESSION.md CURLOPT_COPYPOSTFIELDS.md CURLOPT_CRLF.md CURLOPT_CRLFILE.md CURLOPT_CURLU.md CURLOPT_CUSTOMREQUEST.md CURLOPT_DEBUGDATA.md CURLOPT_DEBUGFUNCTION.md CURLOPT_DEFAULT_PROTOCOL.md CURLOPT_DIRLISTONLY.md CURLOPT_DISALLOW_USERNAME_IN_URL.md CURLOPT_DNS_CACHE_TIMEOUT.md CURLOPT_DNS_INTERFACE.md CURLOPT_DNS_LOCAL_IP4.md CURLOPT_DNS_LOCAL_IP6.md CURLOPT_DNS_SERVERS.md CURLOPT_DNS_SHUFFLE_ADDRESSES.md CURLOPT_DNS_USE_GLOBAL_CACHE.md CURLOPT_DOH_SSL_VERIFYHOST.md CURLOPT_DOH_SSL_VERIFYPEER.md CURLOPT_DOH_SSL_VERIFYSTATUS.md CURLOPT_DOH_URL.md CURLOPT_ECH.md CURLOPT_EGDSOCKET.md CURLOPT_ERRORBUFFER.md CURLOPT_EXPECT_100_TIMEOUT_MS.md CURLOPT_FAILONERROR.md CURLOPT_FILETIME.md CURLOPT_FNMATCH_DATA.md CURLOPT_FNMATCH_FUNCTION.md CURLOPT_FOLLOWLOCATION.md CURLOPT_FORBID_REUSE.md CURLOPT_FRESH_CONNECT.md CURLOPT_FTPPORT.md CURLOPT_FTPSSLAUTH.md CURLOPT_FTP_ACCOUNT.md CURLOPT_FTP_ALTERNATIVE_TO_USER.md CURLOPT_FTP_CREATE_MISSING_DIRS.md CURLOPT_FTP_FILEMETHOD.md CURLOPT_FTP_SKIP_PASV_IP.md CURLOPT_FTP_SSL_CCC.md CURLOPT_FTP_USE_EPRT.md CURLOPT_FTP_USE_EPSV.md CURLOPT_FTP_USE_PRET.md CURLOPT_GSSAPI_DELEGATION.md CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.md CURLOPT_HAPROXYPROTOCOL.md CURLOPT_HAPROXY_CLIENT_IP.md CURLOPT_HEADER.md CURLOPT_HEADERDATA.md CURLOPT_HEADERFUNCTION.md CURLOPT_HEADEROPT.md CURLOPT_HSTS.md CURLOPT_HSTSREADDATA.md CURLOPT_HSTSREADFUNCTION.md CURLOPT_HSTSWRITEDATA.md CURLOPT_HSTSWRITEFUNCTION.md CURLOPT_HSTS_CTRL.md CURLOPT_HTTP09_ALLOWED.md CURLOPT_HTTP200ALIASES.md CURLOPT_HTTPAUTH.md CURLOPT_HTTPGET.md CURLOPT_HTTPHEADER.md CURLOPT_HTTPPOST.md CURLOPT_HTTPPROXYTUNNEL.md CURLOPT_HTTP_CONTENT_DECODING.md CURLOPT_HTTP_TRANSFER_DECODING.md CURLOPT_HTTP_VERSION.md CURLOPT_IGNORE_CONTENT_LENGTH.md CURLOPT_INFILESIZE.md CURLOPT_INFILESIZE_LARGE.md CURLOPT_INTERFACE.md CURLOPT_INTERLEAVEDATA.md CURLOPT_INTERLEAVEFUNCTION.md CURLOPT_IOCTLDATA.md CURLOPT_IOCTLFUNCTION.md CURLOPT_IPRESOLVE.md CURLOPT_ISSUERCERT.md CURLOPT_ISSUERCERT_BLOB.md CURLOPT_KEEP_SENDING_ON_ERROR.md CURLOPT_KEYPASSWD.md CURLOPT_KRBLEVEL.md CURLOPT_LOCALPORT.md CURLOPT_LOCALPORTRANGE.md CURLOPT_LOGIN_OPTIONS.md CURLOPT_LOW_SPEED_LIMIT.md CURLOPT_LOW_SPEED_TIME.md CURLOPT_MAIL_AUTH.md CURLOPT_MAIL_FROM.md CURLOPT_MAIL_RCPT.md CURLOPT_MAIL_RCPT_ALLOWFAILS.md CURLOPT_MAXAGE_CONN.md CURLOPT_MAXCONNECTS.md CURLOPT_MAXFILESIZE.md CURLOPT_MAXFILESIZE_LARGE.md CURLOPT_MAXLIFETIME_CONN.md CURLOPT_MAXREDIRS.md CURLOPT_MAX_RECV_SPEED_LARGE.md CURLOPT_MAX_SEND_SPEED_LARGE.md CURLOPT_MIMEPOST.md CURLOPT_MIME_OPTIONS.md CURLOPT_NETRC.md CURLOPT_NETRC_FILE.md CURLOPT_NEW_DIRECTORY_PERMS.md CURLOPT_NEW_FILE_PERMS.md CURLOPT_NOBODY.md CURLOPT_NOPROGRESS.md CURLOPT_NOPROXY.md CURLOPT_NOSIGNAL.md CURLOPT_OPENSOCKETDATA.md CURLOPT_OPENSOCKETFUNCTION.md CURLOPT_PASSWORD.md CURLOPT_PATH_AS_IS.md CURLOPT_PINNEDPUBLICKEY.md CURLOPT_PIPEWAIT.md CURLOPT_PORT.md CURLOPT_POST.md CURLOPT_POSTFIELDS.md CURLOPT_POSTFIELDSIZE.md CURLOPT_POSTFIELDSIZE_LARGE.md CURLOPT_POSTQUOTE.md CURLOPT_POSTREDIR.md CURLOPT_PREQUOTE.md CURLOPT_PREREQDATA.md CURLOPT_PREREQFUNCTION.md CURLOPT_PRE_PROXY.md CURLOPT_PRIVATE.md CURLOPT_PROGRESSDATA.md CURLOPT_PROGRESSFUNCTION.md CURLOPT_PROTOCOLS.md CURLOPT_PROTOCOLS_STR.md CURLOPT_PROXY.md CURLOPT_PROXYAUTH.md CURLOPT_PROXYHEADER.md CURLOPT_PROXYPASSWORD.md CURLOPT_PROXYPORT.md CURLOPT_PROXYTYPE.md CURLOPT_PROXYUSERNAME.md CURLOPT_PROXYUSERPWD.md CURLOPT_PROXY_CAINFO.md CURLOPT_PROXY_CAINFO_BLOB.md CURLOPT_PROXY_CAPATH.md CURLOPT_PROXY_CRLFILE.md CURLOPT_PROXY_ISSUERCERT.md CURLOPT_PROXY_ISSUERCERT_BLOB.md CURLOPT_PROXY_KEYPASSWD.md CURLOPT_PROXY_PINNEDPUBLICKEY.md CURLOPT_PROXY_SERVICE_NAME.md CURLOPT_PROXY_SSLCERT.md CURLOPT_PROXY_SSLCERTTYPE.md CURLOPT_PROXY_SSLCERT_BLOB.md CURLOPT_PROXY_SSLKEY.md CURLOPT_PROXY_SSLKEYTYPE.md CURLOPT_PROXY_SSLKEY_BLOB.md CURLOPT_PROXY_SSLVERSION.md CURLOPT_PROXY_SSL_CIPHER_LIST.md CURLOPT_PROXY_SSL_OPTIONS.md CURLOPT_PROXY_SSL_VERIFYHOST.md CURLOPT_PROXY_SSL_VERIFYPEER.md CURLOPT_PROXY_TLS13_CIPHERS.md CURLOPT_PROXY_TLSAUTH_PASSWORD.md CURLOPT_PROXY_TLSAUTH_TYPE.md CURLOPT_PROXY_TLSAUTH_USERNAME.md CURLOPT_PROXY_TRANSFER_MODE.md CURLOPT_PUT.md CURLOPT_QUICK_EXIT.md CURLOPT_QUOTE.md CURLOPT_RANDOM_FILE.md CURLOPT_RANGE.md CURLOPT_READDATA.md CURLOPT_READFUNCTION.md CURLOPT_REDIR_PROTOCOLS.md CURLOPT_REDIR_PROTOCOLS_STR.md CURLOPT_REFERER.md CURLOPT_REQUEST_TARGET.md CURLOPT_RESOLVE.md CURLOPT_RESOLVER_START_DATA.md CURLOPT_RESOLVER_START_FUNCTION.md CURLOPT_RESUME_FROM.md CURLOPT_RESUME_FROM_LARGE.md CURLOPT_RTSP_CLIENT_CSEQ.md CURLOPT_RTSP_REQUEST.md CURLOPT_RTSP_SERVER_CSEQ.md CURLOPT_RTSP_SESSION_ID.md CURLOPT_RTSP_STREAM_URI.md CURLOPT_RTSP_TRANSPORT.md CURLOPT_SASL_AUTHZID.md CURLOPT_SASL_IR.md CURLOPT_SEEKDATA.md CURLOPT_SEEKFUNCTION.md CURLOPT_SERVER_RESPONSE_TIMEOUT.md CURLOPT_SERVER_RESPONSE_TIMEOUT_MS.md CURLOPT_SERVICE_NAME.md CURLOPT_SHARE.md CURLOPT_SOCKOPTDATA.md CURLOPT_SOCKOPTFUNCTION.md CURLOPT_SOCKS5_AUTH.md CURLOPT_SOCKS5_GSSAPI_NEC.md CURLOPT_SOCKS5_GSSAPI_SERVICE.md CURLOPT_SSH_AUTH_TYPES.md CURLOPT_SSH_COMPRESSION.md CURLOPT_SSH_HOSTKEYDATA.md CURLOPT_SSH_HOSTKEYFUNCTION.md CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.md CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256.md CURLOPT_SSH_KEYDATA.md CURLOPT_SSH_KEYFUNCTION.md CURLOPT_SSH_KNOWNHOSTS.md CURLOPT_SSH_PRIVATE_KEYFILE.md CURLOPT_SSH_PUBLIC_KEYFILE.md CURLOPT_SSLCERT.md CURLOPT_SSLCERTTYPE.md CURLOPT_SSLCERT_BLOB.md CURLOPT_SSLENGINE.md CURLOPT_SSLENGINE_DEFAULT.md CURLOPT_SSLKEY.md CURLOPT_SSLKEYTYPE.md CURLOPT_SSLKEY_BLOB.md CURLOPT_SSLVERSION.md CURLOPT_SSL_CIPHER_LIST.md CURLOPT_SSL_CTX_DATA.md CURLOPT_SSL_CTX_FUNCTION.md CURLOPT_SSL_EC_CURVES.md CURLOPT_SSL_ENABLE_ALPN.md CURLOPT_SSL_ENABLE_NPN.md CURLOPT_SSL_FALSESTART.md CURLOPT_SSL_OPTIONS.md CURLOPT_SSL_SESSIONID_CACHE.md CURLOPT_SSL_SIGNATURE_ALGORITHMS.md CURLOPT_SSL_VERIFYHOST.md CURLOPT_SSL_VERIFYPEER.md CURLOPT_SSL_VERIFYSTATUS.md CURLOPT_STDERR.md CURLOPT_STREAM_DEPENDS.md CURLOPT_STREAM_DEPENDS_E.md CURLOPT_STREAM_WEIGHT.md CURLOPT_SUPPRESS_CONNECT_HEADERS.md CURLOPT_TCP_FASTOPEN.md CURLOPT_TCP_KEEPALIVE.md CURLOPT_TCP_KEEPCNT.md CURLOPT_TCP_KEEPIDLE.md CURLOPT_TCP_KEEPINTVL.md CURLOPT_TCP_NODELAY.md CURLOPT_TELNETOPTIONS.md CURLOPT_TFTP_BLKSIZE.md CURLOPT_TFTP_NO_OPTIONS.md CURLOPT_TIMECONDITION.md CURLOPT_TIMEOUT.md CURLOPT_TIMEOUT_MS.md CURLOPT_TIMEVALUE.md CURLOPT_TIMEVALUE_LARGE.md CURLOPT_TLS13_CIPHERS.md CURLOPT_TLSAUTH_PASSWORD.md CURLOPT_TLSAUTH_TYPE.md CURLOPT_TLSAUTH_USERNAME.md CURLOPT_TRAILERDATA.md CURLOPT_TRAILERFUNCTION.md CURLOPT_TRANSFERTEXT.md CURLOPT_TRANSFER_ENCODING.md CURLOPT_UNIX_SOCKET_PATH.md CURLOPT_UNRESTRICTED_AUTH.md CURLOPT_UPKEEP_INTERVAL_MS.md CURLOPT_UPLOAD.md CURLOPT_UPLOAD_BUFFERSIZE.md CURLOPT_UPLOAD_FLAGS.md CURLOPT_URL.md CURLOPT_USERAGENT.md CURLOPT_USERNAME.md CURLOPT_USERPWD.md CURLOPT_USE_SSL.md CURLOPT_VERBOSE.md CURLOPT_WILDCARDMATCH.md CURLOPT_WRITEDATA.md CURLOPT_WRITEFUNCTION.md CURLOPT_WS_OPTIONS.md CURLOPT_XFERINFODATA.md CURLOPT_XFERINFOFUNCTION.md CURLOPT_XOAUTH2_BEARER.md CURLSHOPT_LOCKFUNC.md CURLSHOPT_SHARE.md CURLSHOPT_UNLOCKFUNC.md CURLSHOPT_UNSHARE.md CURLSHOPT_USERDATA.md Makefile.am Makefile.incinclude
curl
Makefile.am curl.h curlver.h easy.h header.h mprintf.h multi.h options.h stdcheaders.h system.h typecheck-gcc.h urlapi.h websockets.hlib
curlx
base64.c base64.h basename.c basename.h dynbuf.c dynbuf.h fopen.c fopen.h inet_ntop.c inet_ntop.h inet_pton.c inet_pton.h multibyte.c multibyte.h nonblock.c nonblock.h snprintf.c snprintf.h strcopy.c strcopy.h strdup.c strdup.h strerr.c strerr.h strparse.c strparse.h timediff.c timediff.h timeval.c timeval.h version_win32.c version_win32.h wait.c wait.h warnless.c warnless.h winapi.c winapi.hvauth
cleartext.c cram.c digest.c digest.h digest_sspi.c gsasl.c krb5_gssapi.c krb5_sspi.c ntlm.c ntlm_sspi.c oauth2.c spnego_gssapi.c spnego_sspi.c vauth.c vauth.hvquic
curl_ngtcp2.c curl_ngtcp2.h curl_quiche.c curl_quiche.h vquic-tls.c vquic-tls.h vquic.c vquic.h vquic_int.hvtls
apple.c apple.h cipher_suite.c cipher_suite.h gtls.c gtls.h hostcheck.c hostcheck.h keylog.c keylog.h mbedtls.c mbedtls.h openssl.c openssl.h rustls.c rustls.h schannel.c schannel.h schannel_int.h schannel_verify.c vtls.c vtls.h vtls_int.h vtls_scache.c vtls_scache.h vtls_spack.c vtls_spack.h wolfssl.c wolfssl.h x509asn1.c x509asn1.hm4
.gitignore curl-amissl.m4 curl-apple-sectrust.m4 curl-compilers.m4 curl-confopts.m4 curl-functions.m4 curl-gnutls.m4 curl-mbedtls.m4 curl-openssl.m4 curl-override.m4 curl-reentrant.m4 curl-rustls.m4 curl-schannel.m4 curl-sysconfig.m4 curl-wolfssl.m4 xc-am-iface.m4 xc-cc-check.m4 xc-lt-iface.m4 xc-val-flgs.m4 zz40-xc-ovr.m4 zz50-xc-ovr.m4projects
OS400
.checksrc README.OS400 ccsidcurl.c ccsidcurl.h config400.default curl.cmd curl.inc.in curlcl.c curlmain.c initscript.sh make-docs.sh make-include.sh make-lib.sh make-src.sh make-tests.sh makefile.sh os400sys.c os400sys.hWindows
tmpl
.gitattributes README.txt curl-all.sln curl.sln curl.vcxproj curl.vcxproj.filters libcurl.sln libcurl.vcxproj libcurl.vcxproj.filtersvms
Makefile.am backup_gnv_curl_src.com build_curl-config_script.com build_gnv_curl.com build_gnv_curl_pcsi_desc.com build_gnv_curl_pcsi_text.com build_gnv_curl_release_notes.com build_libcurl_pc.com build_vms.com clean_gnv_curl.com compare_curl_source.com config_h.com curl_crtl_init.c curl_gnv_build_steps.txt curl_release_note_start.txt curl_startup.com curlmsg.h curlmsg.msg curlmsg.sdl curlmsg_vms.h generate_config_vms_h_curl.com generate_vax_transfer.com gnv_conftest.c_first gnv_curl_configure.sh gnv_libcurl_symbols.opt gnv_link_curl.com macro32_exactcase.patch make_gnv_curl_install.sh make_pcsi_curl_kit_name.com pcsi_gnv_curl_file_list.txt pcsi_product_gnv_curl.com readme report_openssl_version.c setup_gnv_curl_build.com stage_curl_install.com vms_eco_level.hscripts
.checksrc CMakeLists.txt Makefile.am badwords badwords-all badwords.txt cd2cd cd2nroff cdall checksrc-all.pl checksrc.pl cmakelint.sh completion.pl contributors.sh contrithanks.sh coverage.sh delta dmaketgz extract-unit-protos firefox-db2pem.sh installcheck.sh maketgz managen mdlinkcheck mk-ca-bundle.pl mk-unity.pl nroff2cd perlcheck.sh pythonlint.sh randdisable release-notes.pl release-tools.sh schemetable.c singleuse.pl spacecheck.pl top-complexity top-length verify-release wcurlsrc
.checksrc .gitignore CMakeLists.txt Makefile.am Makefile.inc config2setopts.c config2setopts.h curl.rc curlinfo.c mk-file-embed.pl mkhelp.pl slist_wc.c slist_wc.h terminal.c terminal.h tool_cb_dbg.c tool_cb_dbg.h tool_cb_hdr.c tool_cb_hdr.h tool_cb_prg.c tool_cb_prg.h tool_cb_rea.c tool_cb_rea.h tool_cb_see.c tool_cb_see.h tool_cb_soc.c tool_cb_soc.h tool_cb_wrt.c tool_cb_wrt.h tool_cfgable.c tool_cfgable.h tool_dirhie.c tool_dirhie.h tool_doswin.c tool_doswin.h tool_easysrc.c tool_easysrc.h tool_filetime.c tool_filetime.h tool_findfile.c tool_findfile.h tool_formparse.c tool_formparse.h tool_getparam.c tool_getparam.h tool_getpass.c tool_getpass.h tool_help.c tool_help.h tool_helpers.c tool_helpers.h tool_hugehelp.h tool_ipfs.c tool_ipfs.h tool_libinfo.c tool_libinfo.h tool_listhelp.c tool_main.c tool_main.h tool_msgs.c tool_msgs.h tool_operate.c tool_operate.h tool_operhlp.c tool_operhlp.h tool_paramhlp.c tool_paramhlp.h tool_parsecfg.c tool_parsecfg.h tool_progress.c tool_progress.h tool_sdecls.h tool_setopt.c tool_setopt.h tool_setup.h tool_ssls.c tool_ssls.h tool_stderr.c tool_stderr.h tool_urlglob.c tool_urlglob.h tool_util.c tool_util.h tool_version.h tool_vms.c tool_vms.h tool_writeout.c tool_writeout.h tool_writeout_json.c tool_writeout_json.h tool_xattr.c tool_xattr.h var.c var.htests
certs
.gitignore CMakeLists.txt Makefile.am Makefile.inc genserv.pl srp-verifier-conf srp-verifier-db test-ca.cnf test-ca.prm test-client-cert.prm test-client-eku-only.prm test-localhost-san-first.prm test-localhost-san-last.prm test-localhost.nn.prm test-localhost.prm test-localhost0h.prmdata
.gitignore DISABLED Makefile.am data-xml1 data1400.c data1401.c data1402.c data1403.c data1404.c data1405.c data1406.c data1407.c data1420.c data1461.txt data1463.txt data1465.c data1481.c data1705-1.md data1705-2.md data1705-3.md data1705-4.md data1705-stdout.1 data1706-1.md data1706-2.md data1706-3.md data1706-4.md data1706-stdout.txt data320.html test1 test10 test100 test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 test1008 test1009 test101 test1010 test1011 test1012 test1013 test1014 test1015 test1016 test1017 test1018 test1019 test102 test1020 test1021 test1022 test1023 test1024 test1025 test1026 test1027 test1028 test1029 test103 test1030 test1031 test1032 test1033 test1034 test1035 test1036 test1037 test1038 test1039 test104 test1040 test1041 test1042 test1043 test1044 test1045 test1046 test1047 test1048 test1049 test105 test1050 test1051 test1052 test1053 test1054 test1055 test1056 test1057 test1058 test1059 test106 test1060 test1061 test1062 test1063 test1064 test1065 test1066 test1067 test1068 test1069 test107 test1070 test1071 test1072 test1073 test1074 test1075 test1076 test1077 test1078 test1079 test108 test1080 test1081 test1082 test1083 test1084 test1085 test1086 test1087 test1088 test1089 test109 test1090 test1091 test1092 test1093 test1094 test1095 test1096 test1097 test1098 test1099 test11 test110 test1100 test1101 test1102 test1103 test1104 test1105 test1106 test1107 test1108 test1109 test111 test1110 test1111 test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 test112 test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 test1128 test1129 test113 test1130 test1131 test1132 test1133 test1134 test1135 test1136 test1137 test1138 test1139 test114 test1140 test1141 test1142 test1143 test1144 test1145 test1146 test1147 test1148 test1149 test115 test1150 test1151 test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 test116 test1160 test1161 test1162 test1163 test1164 test1165 test1166 test1167 test1168 test1169 test117 test1170 test1171 test1172 test1173 test1174 test1175 test1176 test1177 test1178 test1179 test118 test1180 test1181 test1182 test1183 test1184 test1185 test1186 test1187 test1188 test1189 test119 test1190 test1191 test1192 test1193 test1194 test1195 test1196 test1197 test1198 test1199 test12 test120 test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 test1208 test1209 test121 test1210 test1211 test1212 test1213 test1214 test1215 test1216 test1217 test1218 test1219 test122 test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 test1228 test1229 test123 test1230 test1231 test1232 test1233 test1234 test1235 test1236 test1237 test1238 test1239 test124 test1240 test1241 test1242 test1243 test1244 test1245 test1246 test1247 test1248 test1249 test125 test1250 test1251 test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 test126 test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 test1268 test1269 test127 test1270 test1271 test1272 test1273 test1274 test1275 test1276 test1277 test1278 test1279 test128 test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 test1288 test1289 test129 test1290 test1291 test1292 test1293 test1294 test1295 test1296 test1297 test1298 test1299 test13 test130 test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 test1308 test1309 test131 test1310 test1311 test1312 test1313 test1314 test1315 test1316 test1317 test1318 test1319 test132 test1320 test1321 test1322 test1323 test1324 test1325 test1326 test1327 test1328 test1329 test133 test1330 test1331 test1332 test1333 test1334 test1335 test1336 test1337 test1338 test1339 test134 test1340 test1341 test1342 test1343 test1344 test1345 test1346 test1347 test1348 test1349 test135 test1350 test1351 test1352 test1353 test1354 test1355 test1356 test1357 test1358 test1359 test136 test1360 test1361 test1362 test1363 test1364 test1365 test1366 test1367 test1368 test1369 test137 test1370 test1371 test1372 test1373 test1374 test1375 test1376 test1377 test1378 test1379 test138 test1380 test1381 test1382 test1383 test1384 test1385 test1386 test1387 test1388 test1389 test139 test1390 test1391 test1392 test1393 test1394 test1395 test1396 test1397 test1398 test1399 test14 test140 test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 test1408 test1409 test141 test1410 test1411 test1412 test1413 test1414 test1415 test1416 test1417 test1418 test1419 test142 test1420 test1421 test1422 test1423 test1424 test1425 test1426 test1427 test1428 test1429 test143 test1430 test1431 test1432 test1433 test1434 test1435 test1436 test1437 test1438 test1439 test144 test1440 test1441 test1442 test1443 test1444 test1445 test1446 test1447 test1448 test1449 test145 test1450 test1451 test1452 test1453 test1454 test1455 test1456 test1457 test1458 test1459 test146 test1460 test1461 test1462 test1463 test1464 test1465 test1466 test1467 test1468 test1469 test147 test1470 test1471 test1472 test1473 test1474 test1475 test1476 test1477 test1478 test1479 test148 test1480 test1481 test1482 test1483 test1484 test1485 test1486 test1487 test1488 test1489 test149 test1490 test1491 test1492 test1493 test1494 test1495 test1496 test1497 test1498 test1499 test15 test150 test1500 test1501 test1502 test1503 test1504 test1505 test1506 test1507 test1508 test1509 test151 test1510 test1511 test1512 test1513 test1514 test1515 test1516 test1517 test1518 test1519 test152 test1520 test1521 test1522 test1523 test1524 test1525 test1526 test1527 test1528 test1529 test153 test1530 test1531 test1532 test1533 test1534 test1535 test1536 test1537 test1538 test1539 test154 test1540 test1541 test1542 test1543 test1544 test1545 test1546 test1547 test1548 test1549 test155 test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 test1558 test1559 test156 test1560 test1561 test1562 test1563 test1564 test1565 test1566 test1567 test1568 test1569 test157 test1570 test1571 test1572 test1573 test1574 test1575 test1576 test1577 test1578 test1579 test158 test1580 test1581 test1582 test1583 test1584 test1585 test1586 test1587 test1588 test1589 test159 test1590 test1591 test1592 test1593 test1594 test1595 test1596 test1597 test1598 test1599 test16 test160 test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 test1608 test1609 test161 test1610 test1611 test1612 test1613 test1614 test1615 test1616 test1617 test1618 test1619 test162 test1620 test1621 test1622 test1623 test1624 test1625 test1626 test1627 test1628 test1629 test163 test1630 test1631 test1632 test1633 test1634 test1635 test1636 test1637 test1638 test1639 test164 test1640 test1641 test1642 test1643 test1644 test1645 test165 test1650 test1651 test1652 test1653 test1654 test1655 test1656 test1657 test1658 test1659 test166 test1660 test1661 test1662 test1663 test1664 test1665 test1666 test1667 test1668 test1669 test167 test1670 test1671 test1672 test1673 test1674 test1675 test1676 test168 test1680 test1681 test1682 test1683 test1684 test1685 test169 test17 test170 test1700 test1701 test1702 test1703 test1704 test1705 test1706 test1707 test1708 test1709 test171 test1710 test1711 test1712 test1713 test1714 test1715 test172 test1720 test1721 test173 test174 test175 test176 test177 test178 test179 test18 test180 test1800 test1801 test1802 test181 test182 test183 test184 test1847 test1848 test1849 test185 test1850 test1851 test186 test187 test188 test189 test19 test190 test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 test1908 test1909 test191 test1910 test1911 test1912 test1913 test1914 test1915 test1916 test1917 test1918 test1919 test192 test1920 test1921 test193 test1933 test1934 test1935 test1936 test1937 test1938 test1939 test194 test1940 test1941 test1942 test1943 test1944 test1945 test1946 test1947 test1948 test195 test1955 test1956 test1957 test1958 test1959 test196 test1960 test1964 test1965 test1966 test197 test1970 test1971 test1972 test1973 test1974 test1975 test1976 test1977 test1978 test1979 test198 test1980 test1981 test1982 test1983 test1984 test199 test2 test20 test200 test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 test2008 test2009 test201 test2010 test2011 test2012 test2013 test2014 test202 test2023 test2024 test2025 test2026 test2027 test2028 test2029 test203 test2030 test2031 test2032 test2033 test2034 test2035 test2037 test2038 test2039 test204 test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 test2048 test2049 test205 test2050 test2051 test2052 test2053 test2054 test2055 test2056 test2057 test2058 test2059 test206 test2060 test2061 test2062 test2063 test2064 test2065 test2066 test2067 test2068 test2069 test207 test2070 test2071 test2072 test2073 test2074 test2075 test2076 test2077 test2078 test2079 test208 test2080 test2081 test2082 test2083 test2084 test2085 test2086 test2087 test2088 test2089 test209 test2090 test2091 test2092 test21 test210 test2100 test2101 test2102 test2103 test2104 test211 test212 test213 test214 test215 test216 test217 test218 test219 test22 test220 test2200 test2201 test2202 test2203 test2204 test2205 test2206 test2207 test221 test222 test223 test224 test225 test226 test227 test228 test229 test23 test230 test2300 test2301 test2302 test2303 test2304 test2306 test2307 test2308 test2309 test231 test232 test233 test234 test235 test236 test237 test238 test239 test24 test240 test2400 test2401 test2402 test2403 test2404 test2405 test2406 test2407 test2408 test2409 test241 test2410 test2411 test242 test243 test244 test245 test246 test247 test248 test249 test25 test250 test2500 test2501 test2502 test2503 test2504 test2505 test2506 test251 test252 test253 test254 test255 test256 test257 test258 test259 test26 test260 test2600 test2601 test2602 test2603 test2604 test2605 test261 test262 test263 test264 test265 test266 test267 test268 test269 test27 test270 test2700 test2701 test2702 test2703 test2704 test2705 test2706 test2707 test2708 test2709 test271 test2710 test2711 test2712 test2713 test2714 test2715 test2716 test2717 test2718 test2719 test272 test2720 test2721 test2722 test2723 test273 test274 test275 test276 test277 test278 test279 test28 test280 test281 test282 test283 test284 test285 test286 test287 test288 test289 test29 test290 test291 test292 test293 test294 test295 test296 test297 test298 test299 test3 test30 test300 test3000 test3001 test3002 test3003 test3004 test3005 test3006 test3007 test3008 test3009 test301 test3010 test3011 test3012 test3013 test3014 test3015 test3016 test3017 test3018 test3019 test302 test3020 test3021 test3022 test3023 test3024 test3025 test3026 test3027 test3028 test3029 test303 test3030 test3031 test3032 test3033 test3034 test3035 test3036 test304 test305 test306 test307 test308 test309 test31 test310 test3100 test3101 test3102 test3103 test3104 test3105 test3106 test311 test312 test313 test314 test315 test316 test317 test318 test319 test32 test320 test3200 test3201 test3202 test3203 test3204 test3205 test3206 test3207 test3208 test3209 test321 test3210 test3211 test3212 test3213 test3214 test3215 test3216 test3217 test3218 test3219 test322 test3220 test323 test324 test325 test326 test327 test328 test329 test33 test330 test3300 test3301 test3302 test331 test332 test333 test334 test335 test336 test337 test338 test339 test34 test340 test341 test342 test343 test344 test345 test346 test347 test348 test349 test35 test350 test351 test352 test353 test354 test355 test356 test357 test358 test359 test36 test360 test361 test362 test363 test364 test365 test366 test367 test368 test369 test37 test370 test371 test372 test373 test374 test375 test376 test378 test379 test38 test380 test381 test383 test384 test385 test386 test387 test388 test389 test39 test390 test391 test392 test393 test394 test395 test396 test397 test398 test399 test4 test40 test400 test4000 test4001 test401 test402 test403 test404 test405 test406 test407 test408 test409 test41 test410 test411 test412 test413 test414 test415 test416 test417 test418 test419 test42 test420 test421 test422 test423 test424 test425 test426 test427 test428 test429 test43 test430 test431 test432 test433 test434 test435 test436 test437 test438 test439 test44 test440 test441 test442 test443 test444 test445 test446 test447 test448 test449 test45 test450 test451 test452 test453 test454 test455 test456 test457 test458 test459 test46 test460 test461 test462 test463 test467 test468 test469 test47 test470 test471 test472 test473 test474 test475 test476 test477 test478 test479 test48 test480 test481 test482 test483 test484 test485 test486 test487 test488 test489 test49 test490 test491 test492 test493 test494 test495 test496 test497 test498 test499 test5 test50 test500 test501 test502 test503 test504 test505 test506 test507 test508 test509 test51 test510 test511 test512 test513 test514 test515 test516 test517 test518 test519 test52 test520 test521 test522 test523 test524 test525 test526 test527 test528 test529 test53 test530 test531 test532 test533 test534 test535 test536 test537 test538 test539 test54 test540 test541 test542 test543 test544 test545 test546 test547 test548 test549 test55 test550 test551 test552 test553 test554 test555 test556 test557 test558 test559 test56 test560 test561 test562 test563 test564 test565 test566 test567 test568 test569 test57 test570 test571 test572 test573 test574 test575 test576 test577 test578 test579 test58 test580 test581 test582 test583 test584 test585 test586 test587 test588 test589 test59 test590 test591 test592 test593 test594 test595 test596 test597 test598 test599 test6 test60 test600 test601 test602 test603 test604 test605 test606 test607 test608 test609 test61 test610 test611 test612 test613 test614 test615 test616 test617 test618 test619 test62 test620 test621 test622 test623 test624 test625 test626 test627 test628 test629 test63 test630 test631 test632 test633 test634 test635 test636 test637 test638 test639 test64 test640 test641 test642 test643 test644 test645 test646 test647 test648 test649 test65 test650 test651 test652 test653 test654 test655 test656 test658 test659 test66 test660 test661 test662 test663 test664 test665 test666 test667 test668 test669 test67 test670 test671 test672 test673 test674 test675 test676 test677 test678 test679 test68 test680 test681 test682 test683 test684 test685 test686 test687 test688 test689 test69 test690 test691 test692 test693 test694 test695 test696 test697 test698 test699 test7 test70 test700 test701 test702 test703 test704 test705 test706 test707 test708 test709 test71 test710 test711 test712 test713 test714 test715 test716 test717 test718 test719 test72 test720 test721 test722 test723 test724 test725 test726 test727 test728 test729 test73 test730 test731 test732 test733 test734 test735 test736 test737 test738 test739 test74 test740 test741 test742 test743 test744 test745 test746 test747 test748 test749 test75 test750 test751 test752 test753 test754 test755 test756 test757 test758 test759 test76 test760 test761 test762 test763 test764 test765 test766 test767 test768 test769 test77 test770 test771 test772 test773 test774 test775 test776 test777 test778 test779 test78 test780 test781 test782 test783 test784 test785 test786 test787 test788 test789 test79 test790 test791 test792 test793 test794 test795 test796 test797 test798 test799 test8 test80 test800 test801 test802 test803 test804 test805 test806 test807 test808 test809 test81 test810 test811 test812 test813 test814 test815 test816 test817 test818 test819 test82 test820 test821 test822 test823 test824 test825 test826 test827 test828 test829 test83 test830 test831 test832 test833 test834 test835 test836 test837 test838 test839 test84 test840 test841 test842 test843 test844 test845 test846 test847 test848 test849 test85 test850 test851 test852 test853 test854 test855 test856 test857 test858 test859 test86 test860 test861 test862 test863 test864 test865 test866 test867 test868 test869 test87 test870 test871 test872 test873 test874 test875 test876 test877 test878 test879 test88 test880 test881 test882 test883 test884 test885 test886 test887 test888 test889 test89 test890 test891 test892 test893 test894 test895 test896 test897 test898 test899 test9 test90 test900 test901 test902 test903 test904 test905 test906 test907 test908 test909 test91 test910 test911 test912 test913 test914 test915 test916 test917 test918 test919 test92 test920 test921 test922 test923 test924 test925 test926 test927 test928 test929 test93 test930 test931 test932 test933 test934 test935 test936 test937 test938 test939 test94 test940 test941 test942 test943 test944 test945 test946 test947 test948 test949 test95 test950 test951 test952 test953 test954 test955 test956 test957 test958 test959 test96 test960 test961 test962 test963 test964 test965 test966 test967 test968 test969 test97 test970 test971 test972 test973 test974 test975 test976 test977 test978 test979 test98 test980 test981 test982 test983 test984 test985 test986 test987 test988 test989 test99 test990 test991 test992 test993 test994 test995 test996 test997 test998 test999http
testenv
__init__.py caddy.py certs.py client.py curl.py dante.py dnsd.py env.py httpd.py nghttpx.py ports.py sshd.py vsftpd.py ws_echo_server.pylibtest
.gitignore CMakeLists.txt Makefile.am Makefile.inc cli_ftp_upload.c cli_h2_pausing.c cli_h2_serverpush.c cli_h2_upgrade_extreme.c cli_hx_download.c cli_hx_upload.c cli_tls_session_reuse.c cli_upload_pausing.c cli_ws_data.c cli_ws_pingpong.c first.c first.h lib1156.c lib1301.c lib1308.c lib1485.c lib1500.c lib1501.c lib1502.c lib1506.c lib1507.c lib1508.c lib1509.c lib1510.c lib1511.c lib1512.c lib1513.c lib1514.c lib1515.c lib1517.c lib1518.c lib1520.c lib1522.c lib1523.c lib1525.c lib1526.c lib1527.c lib1528.c lib1529.c lib1530.c lib1531.c lib1532.c lib1533.c lib1534.c lib1535.c lib1536.c lib1537.c lib1538.c lib1540.c lib1541.c lib1542.c lib1545.c lib1549.c lib1550.c lib1551.c lib1552.c lib1553.c lib1554.c lib1555.c lib1556.c lib1557.c lib1558.c lib1559.c lib1560.c lib1564.c lib1565.c lib1567.c lib1568.c lib1569.c lib1571.c lib1576.c lib1582.c lib1587.c lib1588.c lib1589.c lib1591.c lib1592.c lib1593.c lib1594.c lib1597.c lib1598.c lib1599.c lib1662.c lib1900.c lib1901.c lib1902.c lib1903.c lib1905.c lib1906.c lib1907.c lib1908.c lib1910.c lib1911.c lib1912.c lib1913.c lib1915.c lib1916.c lib1918.c lib1919.c lib1920.c lib1921.c lib1933.c lib1934.c lib1935.c lib1936.c lib1937.c lib1938.c lib1939.c lib1940.c lib1945.c lib1947.c lib1948.c lib1955.c lib1956.c lib1957.c lib1958.c lib1959.c lib1960.c lib1964.c lib1965.c lib1970.c lib1971.c lib1972.c lib1973.c lib1974.c lib1975.c lib1977.c lib1978.c lib2023.c lib2032.c lib2082.c lib2301.c lib2302.c lib2304.c lib2306.c lib2308.c lib2309.c lib2402.c lib2404.c lib2405.c lib2502.c lib2504.c lib2505.c lib2506.c lib2700.c lib3010.c lib3025.c lib3026.c lib3027.c lib3033.c lib3034.c lib3100.c lib3101.c lib3102.c lib3103.c lib3104.c lib3105.c lib3207.c lib3208.c lib500.c lib501.c lib502.c lib503.c lib504.c lib505.c lib506.c lib507.c lib508.c lib509.c lib510.c lib511.c lib512.c lib513.c lib514.c lib515.c lib516.c lib517.c lib518.c lib519.c lib520.c lib521.c lib523.c lib524.c lib525.c lib526.c lib530.c lib533.c lib536.c lib537.c lib539.c lib540.c lib541.c lib542.c lib543.c lib544.c lib547.c lib549.c lib552.c lib553.c lib554.c lib555.c lib556.c lib557.c lib558.c lib559.c lib560.c lib562.c lib564.c lib566.c lib567.c lib568.c lib569.c lib570.c lib571.c lib572.c lib573.c lib574.c lib575.c lib576.c lib578.c lib579.c lib582.c lib583.c lib586.c lib589.c lib590.c lib591.c lib597.c lib598.c lib599.c lib643.c lib650.c lib651.c lib652.c lib653.c lib654.c lib655.c lib658.c lib659.c lib661.c lib666.c lib667.c lib668.c lib670.c lib674.c lib676.c lib677.c lib678.c lib694.c lib695.c lib751.c lib753.c lib757.c lib758.c lib766.c memptr.c mk-lib1521.pl test1013.pl test1022.pl test307.pl test610.pl test613.pl testtrace.c testtrace.h testutil.c testutil.h unitcheck.hserver
.checksrc .gitignore CMakeLists.txt Makefile.am Makefile.inc dnsd.c first.c first.h getpart.c mqttd.c resolve.c rtspd.c sockfilt.c socksd.c sws.c tftpd.c util.ctunit
.gitignore CMakeLists.txt Makefile.am Makefile.inc README.md tool1394.c tool1604.c tool1621.c tool1622.c tool1623.c tool1720.cunit
.gitignore CMakeLists.txt Makefile.am Makefile.inc README.md unit1300.c unit1302.c unit1303.c unit1304.c unit1305.c unit1307.c unit1309.c unit1323.c unit1330.c unit1395.c unit1396.c unit1397.c unit1398.c unit1399.c unit1600.c unit1601.c unit1602.c unit1603.c unit1605.c unit1606.c unit1607.c unit1608.c unit1609.c unit1610.c unit1611.c unit1612.c unit1614.c unit1615.c unit1616.c unit1620.c unit1625.c unit1626.c unit1627.c unit1636.c unit1650.c unit1651.c unit1652.c unit1653.c unit1654.c unit1655.c unit1656.c unit1657.c unit1658.c unit1660.c unit1661.c unit1663.c unit1664.c unit1666.c unit1667.c unit1668.c unit1669.c unit1674.c unit1675.c unit1676.c unit1979.c unit1980.c unit2600.c unit2601.c unit2602.c unit2603.c unit2604.c unit2605.c unit3200.c unit3205.c unit3211.c unit3212.c unit3213.c unit3214.c unit3216.c unit3219.c unit3300.c unit3301.c unit3302.cexamples
.env config.ini crypto_test.lua env_test.lua fs_example.lua http_server.lua https_test.lua ini_example.lua json.lua log.lua path_fs_example.lua process_example.lua request_download.lua request_test.lua run_all.lua sqlite_example.lua sqlite_http_template.lua stash_test.lua template_test.lua timer.lua websocket.luainiparser
example
iniexample.c iniwrite.c parse.c twisted-errors.ini twisted-genhuge.py twisted-ofkey.ini twisted-ofval.ini twisted.initest
CMakeLists.txt test_dictionary.c test_iniparser.c unity-config.yml unity_config.hjinjac
libjinjac
src
CMakeLists.txt ast.c ast.h block_statement.c block_statement.h buffer.c buffer.h buildin.c buildin.h common.h convert.c convert.h flex_decl.h jfunction.c jfunction.h jinja_expression.l jinja_expression.y jinjac_parse.c jinjac_parse.h jinjac_stream.c jinjac_stream.h jlist.c jlist.h jobject.c jobject.h parameter.c parameter.h str_obj.c str_obj.h trace.c trace.htest
.gitignore CMakeLists.txt autotest.rb test_01.expected test_01.jinja test_01b.expected test_01b.jinja test_01c.expected test_01c.jinja test_01d.expected test_01d.jinja test_02.expected test_02.jinja test_03.expected test_03.jinja test_04.expected test_04.jinja test_05.expected test_05.jinja test_06.expected test_06.jinja test_07.expected test_07.jinja test_08.expected test_08.jinja test_08b.expected test_08b.jinja test_09.expected test_09.jinja test_10.expected test_10.jinja test_11.expected test_11.jinja test_12.expected test_12.jinja test_13.expected test_13.jinja test_14.expected test_14.jinja test_15.expected test_15.jinja test_16.expected test_16.jinja test_17.expected test_17.jinja test_18.expected test_18.jinja test_18b.expected test_18b.jinja test_18c.expected test_18c.jinja test_19.expected test_19.jinja test_19b.expected test_19b.jinja test_19c.expected test_19c.jinja test_19d.expected test_19d.jinja test_19e.expected test_19e.jinja test_19f.expected test_19f.jinja test_20.expected test_20.jinja test_21.expected test_21.jinja test_22.expected test_22.jinja test_22a.expected test_22a.jinja test_22b.expected test_22b.jinja test_23.expected test_23.jinja test_24.expected test_24.jinjalibev
Changes LICENSE Makefile Makefile.am Makefile.in README Symbols.ev Symbols.event aclocal.m4 autogen.sh compile config.guess config.h config.h.in config.status config.sub configure configure.ac depcomp ev++.h ev.3 ev.c ev.h ev.pod ev_epoll.c ev_kqueue.c ev_poll.c ev_port.c ev_select.c ev_vars.h ev_win32.c ev_wrap.h event.c event.h install-sh libev.m4 libtool ltmain.sh missing mkinstalldirs stamp-h1luajit
doc
bluequad-print.css bluequad.css contact.html ext_buffer.html ext_c_api.html ext_ffi.html ext_ffi_api.html ext_ffi_semantics.html ext_ffi_tutorial.html ext_jit.html ext_profiler.html extensions.html install.html luajit.html running.htmldynasm
dasm_arm.h dasm_arm.lua dasm_arm64.h dasm_arm64.lua dasm_mips.h dasm_mips.lua dasm_mips64.lua dasm_ppc.h dasm_ppc.lua dasm_proto.h dasm_x64.lua dasm_x86.h dasm_x86.lua dynasm.luasrc
host
.gitignore README buildvm.c buildvm.h buildvm_asm.c buildvm_fold.c buildvm_lib.c buildvm_libbc.h buildvm_peobj.c genlibbc.lua genminilua.lua genversion.lua minilua.cjit
.gitignore bc.lua bcsave.lua dis_arm.lua dis_arm64.lua dis_arm64be.lua dis_mips.lua dis_mips64.lua dis_mips64el.lua dis_mips64r6.lua dis_mips64r6el.lua dis_mipsel.lua dis_ppc.lua dis_x64.lua dis_x86.lua dump.lua p.lua v.lua zone.luawolfssl
.github
workflows
ada.yml arduino.yml async-examples.yml async.yml atecc608-sim.yml bind.yml cmake-autoconf.yml cmake.yml codespell.yml coverity-scan-fixes.yml cryptocb-only.yml curl.yml cyrus-sasl.yml disable-pk-algs.yml docker-Espressif.yml docker-OpenWrt.yml emnet-nonblock.yml fil-c.yml freertos-mem-track.yml gencertbuf.yml grpc.yml haproxy.yml hostap-vm.yml intelasm-c-fallback.yml ipmitool.yml jwt-cpp.yml krb5.yml libspdm.yml libssh2.yml libvncserver.yml linuxkm.yml macos-apple-native-cert-validation.yml mbedtls.sh mbedtls.yml membrowse-comment.yml membrowse-onboard.yml membrowse-report.yml memcached.sh memcached.yml mono.yml mosquitto.yml msmtp.yml msys2.yml multi-arch.yml multi-compiler.yml net-snmp.yml nginx.yml no-malloc.yml no-tls.yml nss.sh nss.yml ntp.yml ocsp.yml openldap.yml openssh.yml openssl-ech.yml opensslcoexist.yml openvpn.yml os-check.yml packaging.yml pam-ipmi.yml pq-all.yml pr-commit-check.yml psk.yml puf.yml python.yml rng-tools.yml rust-wrapper.yml se050-sim.yml smallStackSize.yml socat.yml softhsm.yml sssd.yml stm32-sim.yml stsafe-a120-sim.yml stunnel.yml symbol-prefixes.yml threadx.yml tls-anvil.yml trackmemory.yml watcomc.yml win-csharp-test.yml wolfCrypt-Wconversion.yml wolfboot-integration.yml wolfsm.yml xcode.yml zephyr-4.x.yml zephyr.ymlIDE
ARDUINO
Arduino_README_prepend.md README.md include.am keywords.txt library.properties.template wolfssl-arduino.cpp wolfssl-arduino.sh wolfssl.hECLIPSE
Espressif
ESP-IDF
examples
template
CMakeLists.txt Makefile README.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp8266wolfssl_benchmark
VisualGDB
wolfssl_benchmark_IDF_v4.4_ESP32.sln wolfssl_benchmark_IDF_v4.4_ESP32.vgdbproj wolfssl_benchmark_IDF_v5_ESP32.sln wolfssl_benchmark_IDF_v5_ESP32.vgdbproj wolfssl_benchmark_IDF_v5_ESP32C3.sln wolfssl_benchmark_IDF_v5_ESP32C3.vgdbproj wolfssl_benchmark_IDF_v5_ESP32S3.sln wolfssl_benchmark_IDF_v5_ESP32S3.vgdbprojwolfssl_client
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_client_ESP8266.vgdbprojwolfssl_server
CMakeLists.txt Makefile README.md README_server_sm.md partitions_singleapp_large.csv sdkconfig.defaults sdkconfig.defaults.esp32c2 sdkconfig.defaults.esp8266 wolfssl_server_ESP8266.vgdbprojwolfssl_test
VisualGDB
wolfssl_test-IDF_v5_ESP32.sln wolfssl_test-IDF_v5_ESP32.vgdbproj wolfssl_test-IDF_v5_ESP32C3.sln wolfssl_test-IDF_v5_ESP32C3.vgdbproj wolfssl_test-IDF_v5_ESP32C6.sln wolfssl_test-IDF_v5_ESP32C6.vgdbproj wolfssl_test_IDF_v5_ESP32S3.sln wolfssl_test_IDF_v5_ESP32S3.vgdbprojGCC-ARM
Makefile Makefile.bench Makefile.client Makefile.common Makefile.server Makefile.static Makefile.test README.md include.am linker.ld linker_fips.ldIAR-EWARM
embOS
SAMV71_XULT
embOS_SAMV71_XULT_user_settings
user_settings.h user_settings_simple_example.h user_settings_verbose_example.hembOS_wolfcrypt_benchmark_SAMV71_XULT
README_wolfcrypt_benchmark wolfcrypt_benchmark.ewd wolfcrypt_benchmark.ewpINTIME-RTOS
Makefile README.md include.am libwolfssl.c libwolfssl.vcxproj user_settings.h wolfExamples.c wolfExamples.h wolfExamples.sln wolfExamples.vcxproj wolfssl-lib.sln wolfssl-lib.vcxprojMQX
Makefile README-jp.md README.md client-tls.c include.am server-tls.c user_config.h user_settings.hMSVS-2019-AZSPHERE
wolfssl_new_azsphere
.gitignore CMakeLists.txt CMakeSettings.json app_manifest.json applibs_versions.h launch.vs.json main.cNETOS
Makefile.wolfcrypt.inc README.md include.am user_settings.h user_settings.h-cert2425 user_settings.h-cert3389 wolfssl_netos_custom.cPlatformIO
examples
wolfssl_benchmark
CMakeLists.txt README.md platformio.ini sdkconfig.defaults wolfssl_benchmark.code-workspaceROWLEY-CROSSWORKS-ARM
Kinetis_FlashPlacement.xml README.md arm_startup.c benchmark_main.c hw.h include.am kinetis_hw.c retarget.c test_main.c user_settings.h wolfssl.hzp wolfssl_ltc.hzpRenesas
e2studio
RA6M3
README.md README_APRA6M_en.md README_APRA6M_jp.md include.amRX72N
EnvisionKit
Simple
README_EN.md README_JP.mdwolfssl_demo
key_data.c key_data.h user_settings.h wolfssl_demo.c wolfssl_demo.h wolfssl_tsip_unit_test.cSTM32Cube
README.md STM32_Benchmarks.md default_conf.ftl include.am main.c wolfssl_example.c wolfssl_example.hWIN
README.txt include.am test.vcxproj user_settings.h user_settings_dtls.h wolfssl-fips.sln wolfssl-fips.vcxprojWIN-SRTP-KDF-140-3
README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxprojWIN10
README.txt include.am resource.h test.vcxproj user_settings.h wolfssl-fips.rc wolfssl-fips.sln wolfssl-fips.vcxprojXCODE
Benchmark
include.amXilinxSDK
README.md bench.sh combine.sh eclipse_formatter_profile.xml graph.sh include.am user_settings.h wolfssl_example.capple-universal
wolfssl-multiplatform
iotsafe
Makefile README.md ca-cert.c devices.c devices.h include.am main.c memory-tls.c startup.c target.ld user_settings.hmynewt
README.md apps.wolfcrypttest.pkg.yml crypto.wolfssl.pkg.yml crypto.wolfssl.syscfg.yml include.am setup.shcerts
1024
ca-cert.der ca-cert.pem ca-key.der ca-key.pem client-cert.der client-cert.pem client-key.der client-key.pem client-keyPub.der dh1024.der dh1024.pem dsa-pub-1024.pem dsa1024.der dsa1024.pem include.am rsa1024.der server-cert.der server-cert.pem server-key.der server-key.pemcrl
extra-crls
ca-int-cert-revoked.pem claim-root.pem crl_critical_entry.pem crlnum_57oct.pem crlnum_64oct.pem general-server-crl.pem large_crlnum.pem large_crlnum2.pemdilithium
bench_dilithium_level2_key.der bench_dilithium_level3_key.der bench_dilithium_level5_key.der include.amecc
bp256r1-key.der bp256r1-key.pem ca-secp256k1-cert.pem ca-secp256k1-key.pem client-bp256r1-cert.der client-bp256r1-cert.pem client-secp256k1-cert.der client-secp256k1-cert.pem genecc.sh include.am secp256k1-key.der secp256k1-key.pem secp256k1-param.pem secp256k1-privkey.der secp256k1-privkey.pem server-bp256r1-cert.der server-bp256r1-cert.pem server-secp256k1-cert.der server-secp256k1-cert.pem server2-secp256k1-cert.der server2-secp256k1-cert.pem wolfssl.cnf wolfssl_384.cnfed25519
ca-ed25519-key.der ca-ed25519-key.pem ca-ed25519-priv.der ca-ed25519-priv.pem ca-ed25519.der ca-ed25519.pem client-ed25519-key.der client-ed25519-key.pem client-ed25519-priv.der client-ed25519-priv.pem client-ed25519.der client-ed25519.pem eddsa-ed25519.der eddsa-ed25519.pem gen-ed25519-certs.sh gen-ed25519-keys.sh gen-ed25519.sh include.am root-ed25519-key.der root-ed25519-key.pem root-ed25519-priv.der root-ed25519-priv.pem root-ed25519.der root-ed25519.pem server-ed25519-cert.pem server-ed25519-key.der server-ed25519-key.pem server-ed25519-priv.der server-ed25519-priv.pem server-ed25519.der server-ed25519.pemed448
ca-ed448-key.der ca-ed448-key.pem ca-ed448-priv.der ca-ed448-priv.pem ca-ed448.der ca-ed448.pem client-ed448-key.der client-ed448-key.pem client-ed448-priv.der client-ed448-priv.pem client-ed448.der client-ed448.pem gen-ed448-certs.sh gen-ed448-keys.sh include.am root-ed448-key.der root-ed448-key.pem root-ed448-priv.der root-ed448-priv.pem root-ed448.der root-ed448.pem server-ed448-cert.pem server-ed448-key.der server-ed448-key.pem server-ed448-priv.der server-ed448-priv.pem server-ed448.der server-ed448.pemexternal
DigiCertGlobalRootCA.pem README.txt ca-digicert-ev.pem ca-globalsign-root.pem ca-google-root.pem ca_collection.pem include.amintermediate
ca_false_intermediate
gentestcert.sh int_ca.key server.key test_ca.key test_ca.pem test_int_not_cacert.pem test_sign_bynoca_srv.pem wolfssl_base.conf wolfssl_srv.conflms
bc_hss_L2_H5_W8_root.der bc_hss_L3_H5_W4_root.der bc_lms_chain_ca.der bc_lms_chain_leaf.der bc_lms_native_bc_root.der bc_lms_sha256_h10_w8_root.der bc_lms_sha256_h5_w4_root.der include.ammldsa
README.txt include.am mldsa44-cert.der mldsa44-cert.pem mldsa44-key.pem mldsa44_bare-priv.der mldsa44_bare-seed.der mldsa44_oqskeypair.der mldsa44_priv-only.der mldsa44_pub-spki.der mldsa44_seed-only.der mldsa44_seed-priv.der mldsa65-cert.der mldsa65-cert.pem mldsa65-key.pem mldsa65_bare-priv.der mldsa65_bare-seed.der mldsa65_oqskeypair.der mldsa65_priv-only.der mldsa65_pub-spki.der mldsa65_seed-only.der mldsa65_seed-priv.der mldsa87-cert.der mldsa87-cert.pem mldsa87-key.pem mldsa87_bare-priv.der mldsa87_bare-seed.der mldsa87_oqskeypair.der mldsa87_priv-only.der mldsa87_pub-spki.der mldsa87_seed-only.der mldsa87_seed-priv.derocsp
imposter-root-ca-cert.der imposter-root-ca-cert.pem imposter-root-ca-key.der imposter-root-ca-key.pem include.am index-ca-and-intermediate-cas.txt index-ca-and-intermediate-cas.txt.attr index-intermediate1-ca-issued-certs.txt index-intermediate1-ca-issued-certs.txt.attr index-intermediate2-ca-issued-certs.txt index-intermediate2-ca-issued-certs.txt.attr index-intermediate3-ca-issued-certs.txt index-intermediate3-ca-issued-certs.txt.attr intermediate1-ca-cert.der intermediate1-ca-cert.pem intermediate1-ca-key.der intermediate1-ca-key.pem intermediate2-ca-cert.der intermediate2-ca-cert.pem intermediate2-ca-key.der intermediate2-ca-key.pem intermediate3-ca-cert.der intermediate3-ca-cert.pem intermediate3-ca-key.der intermediate3-ca-key.pem ocsp-responder-cert.der ocsp-responder-cert.pem ocsp-responder-key.der ocsp-responder-key.pem openssl.cnf renewcerts-for-test.sh renewcerts.sh root-ca-cert.der root-ca-cert.pem root-ca-crl.pem root-ca-key.der root-ca-key.pem server1-cert.der server1-cert.pem server1-chain-noroot.pem server1-key.der server1-key.pem server2-cert.der server2-cert.pem server2-key.der server2-key.pem server3-cert.der server3-cert.pem server3-key.der server3-key.pem server4-cert.der server4-cert.pem server4-key.der server4-key.pem server5-cert.der server5-cert.pem server5-key.der server5-key.pem test-leaf-response.der test-multi-response.der test-response-nointern.der test-response-rsapss.der test-response.derp521
ca-p521-key.der ca-p521-key.pem ca-p521-priv.der ca-p521-priv.pem ca-p521.der ca-p521.pem client-p521-key.der client-p521-key.pem client-p521-priv.der client-p521-priv.pem client-p521.der client-p521.pem gen-p521-certs.sh gen-p521-keys.sh include.am root-p521-key.der root-p521-key.pem root-p521-priv.der root-p521-priv.pem root-p521.der root-p521.pem server-p521-cert.pem server-p521-key.der server-p521-key.pem server-p521-priv.der server-p521-priv.pem server-p521.der server-p521.pemrpk
client-cert-rpk.der client-ecc-cert-rpk.der include.am server-cert-rpk.der server-ecc-cert-rpk.derrsapss
ca-3072-rsapss-key.der ca-3072-rsapss-key.pem ca-3072-rsapss-priv.der ca-3072-rsapss-priv.pem ca-3072-rsapss.der ca-3072-rsapss.pem ca-rsapss-key.der ca-rsapss-key.pem ca-rsapss-priv.der ca-rsapss-priv.pem ca-rsapss.der ca-rsapss.pem client-3072-rsapss-key.der client-3072-rsapss-key.pem client-3072-rsapss-priv.der client-3072-rsapss-priv.pem client-3072-rsapss.der client-3072-rsapss.pem client-rsapss-key.der client-rsapss-key.pem client-rsapss-priv.der client-rsapss-priv.pem client-rsapss.der client-rsapss.pem gen-rsapss-keys.sh include.am renew-rsapss-certs.sh root-3072-rsapss-key.der root-3072-rsapss-key.pem root-3072-rsapss-priv.der root-3072-rsapss-priv.pem root-3072-rsapss.der root-3072-rsapss.pem root-rsapss-key.der root-rsapss-key.pem root-rsapss-priv.der root-rsapss-priv.pem root-rsapss.der root-rsapss.pem server-3072-rsapss-cert.pem server-3072-rsapss-key.der server-3072-rsapss-key.pem server-3072-rsapss-priv.der server-3072-rsapss-priv.pem server-3072-rsapss.der server-3072-rsapss.pem server-mix-rsapss-cert.pem server-rsapss-cert.pem server-rsapss-key.der server-rsapss-key.pem server-rsapss-priv.der server-rsapss-priv.pem server-rsapss.der server-rsapss.pemslhdsa
bench_slhdsa_sha2_128f_key.der bench_slhdsa_sha2_128s_key.der bench_slhdsa_sha2_192f_key.der bench_slhdsa_sha2_192s_key.der bench_slhdsa_sha2_256f_key.der bench_slhdsa_sha2_256s_key.der bench_slhdsa_shake128f_key.der bench_slhdsa_shake128s_key.der bench_slhdsa_shake192f_key.der bench_slhdsa_shake192s_key.der bench_slhdsa_shake256f_key.der bench_slhdsa_shake256s_key.der client-mldsa44-priv.pem client-mldsa44-sha2.der client-mldsa44-sha2.pem client-mldsa44-shake.der client-mldsa44-shake.pem gen-slhdsa-mldsa-certs.sh include.am root-slhdsa-sha2-128s-priv.der root-slhdsa-sha2-128s-priv.pem root-slhdsa-sha2-128s.der root-slhdsa-sha2-128s.pem root-slhdsa-shake-128s-priv.der root-slhdsa-shake-128s-priv.pem root-slhdsa-shake-128s.der root-slhdsa-shake-128s.pem server-mldsa44-priv.pem server-mldsa44-sha2.der server-mldsa44-sha2.pem server-mldsa44-shake.der server-mldsa44-shake.pemsm2
ca-sm2-key.der ca-sm2-key.pem ca-sm2-priv.der ca-sm2-priv.pem ca-sm2.der ca-sm2.pem client-sm2-key.der client-sm2-key.pem client-sm2-priv.der client-sm2-priv.pem client-sm2.der client-sm2.pem fix_sm2_spki.py gen-sm2-certs.sh gen-sm2-keys.sh include.am root-sm2-key.der root-sm2-key.pem root-sm2-priv.der root-sm2-priv.pem root-sm2.der root-sm2.pem self-sm2-cert.pem self-sm2-key.pem self-sm2-priv.pem server-sm2-cert.der server-sm2-cert.pem server-sm2-key.der server-sm2-key.pem server-sm2-priv.der server-sm2-priv.pem server-sm2.der server-sm2.pemstatickeys
dh-ffdhe2048-params.pem dh-ffdhe2048-pub.der dh-ffdhe2048-pub.pem dh-ffdhe2048.der dh-ffdhe2048.pem ecc-secp256r1.der ecc-secp256r1.pem gen-static.sh include.am x25519-pub.der x25519-pub.pem x25519.der x25519.pemtest
catalog.txt cert-bad-neg-int.der cert-bad-oid.der cert-bad-utf8.der cert-ext-ia.cfg cert-ext-ia.der cert-ext-ia.pem cert-ext-joi.cfg cert-ext-joi.der cert-ext-joi.pem cert-ext-mnc.der cert-ext-multiple.cfg cert-ext-multiple.der cert-ext-multiple.pem cert-ext-nc-combined.der cert-ext-nc-combined.pem cert-ext-nc.cfg cert-ext-nc.der cert-ext-nc.pem cert-ext-ncdns.der cert-ext-ncdns.pem cert-ext-ncip.der cert-ext-ncip.pem cert-ext-ncmixed.der cert-ext-ncmulti.der cert-ext-ncmulti.pem cert-ext-ncrid.der cert-ext-ncrid.pem cert-ext-nct.cfg cert-ext-nct.der cert-ext-nct.pem cert-ext-ndir-exc.cfg cert-ext-ndir-exc.der cert-ext-ndir-exc.pem cert-ext-ndir.cfg cert-ext-ndir.der cert-ext-ndir.pem cert-ext-ns.der cert-over-max-altnames.cfg cert-over-max-altnames.der cert-over-max-altnames.pem cert-over-max-nc.cfg cert-over-max-nc.der cert-over-max-nc.pem client-ecc-cert-ski.hex cn-ip-literal.der cn-ip-wildcard.der crit-cert.pem crit-key.pem dh1024.der dh1024.pem dh512.der dh512.pem digsigku.pem encrypteddata.msg gen-badsig.sh gen-ext-certs.sh gen-testcerts.sh include.am kari-keyid-cms.msg ktri-keyid-cms.msg ossl-trusted-cert.pem server-badaltname.der server-badaltname.pem server-badaltnull.der server-badaltnull.pem server-badcn.der server-badcn.pem server-badcnnull.der server-badcnnull.pem server-cert-ecc-badsig.der server-cert-ecc-badsig.pem server-cert-rsa-badsig.der server-cert-rsa-badsig.pem server-duplicate-policy.pem server-garbage.der server-garbage.pem server-goodalt.der server-goodalt.pem server-goodaltwild.der server-goodaltwild.pem server-goodcn.der server-goodcn.pem server-goodcnwild.der server-goodcnwild.pem server-localhost.der server-localhost.pem smime-test-canon.p7s smime-test-multipart-badsig.p7s smime-test-multipart.p7s smime-test.p7stest-pathlen
assemble-chains.sh chainA-ICA1-key.pem chainA-ICA1-pathlen0.pem chainA-assembled.pem chainA-entity-key.pem chainA-entity.pem chainB-ICA1-key.pem chainB-ICA1-pathlen0.pem chainB-ICA2-key.pem chainB-ICA2-pathlen1.pem chainB-assembled.pem chainB-entity-key.pem chainB-entity.pem chainC-ICA1-key.pem chainC-ICA1-pathlen1.pem chainC-assembled.pem chainC-entity-key.pem chainC-entity.pem chainD-ICA1-key.pem chainD-ICA1-pathlen127.pem chainD-assembled.pem chainD-entity-key.pem chainD-entity.pem chainE-ICA1-key.pem chainE-ICA1-pathlen128.pem chainE-assembled.pem chainE-entity-key.pem chainE-entity.pem chainF-ICA1-key.pem chainF-ICA1-pathlen1.pem chainF-ICA2-key.pem chainF-ICA2-pathlen0.pem chainF-assembled.pem chainF-entity-key.pem chainF-entity.pem chainG-ICA1-key.pem chainG-ICA1-pathlen0.pem chainG-ICA2-key.pem chainG-ICA2-pathlen1.pem chainG-ICA3-key.pem chainG-ICA3-pathlen99.pem chainG-ICA4-key.pem chainG-ICA4-pathlen5.pem chainG-ICA5-key.pem chainG-ICA5-pathlen20.pem chainG-ICA6-key.pem chainG-ICA6-pathlen10.pem chainG-ICA7-key.pem chainG-ICA7-pathlen100.pem chainG-assembled.pem chainG-entity-key.pem chainG-entity.pem chainH-ICA1-key.pem chainH-ICA1-pathlen0.pem chainH-ICA2-key.pem chainH-ICA2-pathlen2.pem chainH-ICA3-key.pem chainH-ICA3-pathlen2.pem chainH-ICA4-key.pem chainH-ICA4-pathlen2.pem chainH-assembled.pem chainH-entity-key.pem chainH-entity.pem chainI-ICA1-key.pem chainI-ICA1-no_pathlen.pem chainI-ICA2-key.pem chainI-ICA2-no_pathlen.pem chainI-ICA3-key.pem chainI-ICA3-pathlen2.pem chainI-assembled.pem chainI-entity-key.pem chainI-entity.pem chainJ-ICA1-key.pem chainJ-ICA1-no_pathlen.pem chainJ-ICA2-key.pem chainJ-ICA2-no_pathlen.pem chainJ-ICA3-key.pem chainJ-ICA3-no_pathlen.pem chainJ-ICA4-key.pem chainJ-ICA4-pathlen2.pem chainJ-assembled.pem chainJ-entity-key.pem chainJ-entity.pem include.am refreshkeys.shtest-serial0
ee_normal.pem ee_serial0.pem generate_certs.sh include.am intermediate_serial0.pem root_serial0.pem root_serial0_key.pem selfsigned_nonca_serial0.pemxmss
bc_xmss_chain_ca.der bc_xmss_chain_leaf.der bc_xmss_sha2_10_256_root.der bc_xmss_sha2_16_256_root.der bc_xmssmt_sha2_20_2_256_root.der bc_xmssmt_sha2_20_4_256_root.der bc_xmssmt_sha2_40_8_256_root.der include.amcmake
Config.cmake.in README.md config.in functions.cmake include.am options.h.in wolfssl-config-version.cmake.in wolfssl-targets.cmake.indebian
changelog.in control.in copyright include.am libwolfssl-dev.install libwolfssl.install rules.indoc
dox_comments
header_files
aes.h arc4.h ascon.h asn.h asn_public.h blake2.h bn.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cryptocb.h curve25519.h curve448.h des3.h dh.h doxygen_groups.h doxygen_pages.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h evp.h hash.h hmac.h iotsafe.h kdf.h logging.h md2.h md4.h md5.h memory.h ocsp.h pem.h pkcs11.h pkcs7.h poly1305.h psa.h puf.h pwdbased.h quic.h random.h ripemd.h rsa.h sakke.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h srp.h ssl.h tfm.h types.h wc_encrypt.h wc_port.h wc_she.h wc_slhdsa.h wolfio.hheader_files-ja
aes.h arc4.h ascon.h asn.h asn_public.h blake2.h bn.h camellia.h chacha.h chacha20_poly1305.h cmac.h coding.h compress.h cryptocb.h curve25519.h curve448.h des3.h dh.h doxygen_groups.h doxygen_pages.h dsa.h ecc.h eccsi.h ed25519.h ed448.h error-crypt.h evp.h hash.h hmac.h iotsafe.h kdf.h logging.h md2.h md4.h md5.h memory.h ocsp.h pem.h pkcs11.h pkcs7.h poly1305.h psa.h pwdbased.h quic.h random.h ripemd.h rsa.h sakke.h sha.h sha256.h sha3.h sha512.h signature.h siphash.h srp.h ssl.h tfm.h types.h wc_encrypt.h wc_port.h wolfio.hexamples
async
Makefile README.md async_client.c async_server.c async_tls.c async_tls.h include.am user_settings.hconfigs
README.md include.am user_settings_EBSnet.h user_settings_all.h user_settings_arduino.h user_settings_baremetal.h user_settings_ca.h user_settings_curve25519nonblock.h user_settings_dtls13.h user_settings_eccnonblock.h user_settings_espressif.h user_settings_fipsv2.h user_settings_fipsv5.h user_settings_min_ecc.h user_settings_openssl_compat.h user_settings_pkcs7.h user_settings_platformio.h user_settings_pq.h user_settings_rsa_only.h user_settings_stm32.h user_settings_template.h user_settings_tls12.h user_settings_tls13.h user_settings_wolfboot_keytools.h user_settings_wolfssh.h user_settings_wolftpm.hechoclient
echoclient.c echoclient.h echoclient.sln echoclient.vcproj echoclient.vcxproj include.am quitlinuxkm
Kbuild Makefile README.md get_thread_size.c include.am linuxkm-fips-hash-wrapper.sh linuxkm-fips-hash.c linuxkm_memory.c linuxkm_memory.h linuxkm_wc_port.h lkcapi_aes_glue.c lkcapi_dh_glue.c lkcapi_ecdh_glue.c lkcapi_ecdsa_glue.c lkcapi_glue.c lkcapi_rsa_glue.c lkcapi_sha_glue.c module_exports.c.template module_hooks.c pie_redirect_table.c wolfcrypt.lds x86_vector_register_glue.cm4
ax_add_am_macro.m4 ax_am_jobserver.m4 ax_am_macros.m4 ax_append_compile_flags.m4 ax_append_flag.m4 ax_append_link_flags.m4 ax_append_to_file.m4 ax_atomic.m4 ax_bsdkm.m4 ax_check_compile_flag.m4 ax_check_link_flag.m4 ax_compiler_version.m4 ax_count_cpus.m4 ax_create_generic_config.m4 ax_debug.m4 ax_file_escapes.m4 ax_harden_compiler_flags.m4 ax_linuxkm.m4 ax_print_to_file.m4 ax_pthread.m4 ax_require_defined.m4 ax_tls.m4 ax_vcs_checkout.m4 hexversion.m4 lib_socket_nsl.m4 visibility.m4mqx
wolfcrypt_benchmark
ReferencedRSESystems.xml wolfcrypt_benchmark_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfcrypt_benchmark_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launchwolfcrypt_test
ReferencedRSESystems.xml wolfcrypt_test_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfcrypt_test_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launchwolfssl_client
ReferencedRSESystems.xml wolfssl_client_twrk70f120m_Int_Flash_DDRData_Debug_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_DDRData_Release_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_JTrace.jlink wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_JTrace.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Debug_PnE_U-MultiLink.launch wolfssl_client_twrk70f120m_Int_Flash_SramData_Release_PnE_U-MultiLink.launchscripts
aria-cmake-build-test.sh asn1_oid_sum.pl benchmark.test benchmark_compare.sh cleanup_testfiles.sh crl-gen-openssl.test crl-revoked.test dertoc.pl dtls.test dtlscid.test external.test google.test include.am makedistsmall.sh memtest.sh ocsp-responder-openssl-interop.test ocsp-stapling-with-ca-as-responder.test ocsp-stapling-with-wolfssl-responder.test ocsp-stapling.test ocsp-stapling2.test ocsp-stapling_tls13multi.test ocsp.test openssl.test openssl_srtp.test pem.test ping.test pkcallbacks.test psk.test resume.test rsapss.test sniffer-gen.sh sniffer-ipv6.pcap sniffer-static-rsa.pcap sniffer-testsuite.test sniffer-tls12-keylog.out sniffer-tls12-keylog.pcap sniffer-tls12-keylog.sslkeylog sniffer-tls13-dh-resume.pcap sniffer-tls13-dh.pcap sniffer-tls13-ecc-resume.pcap sniffer-tls13-ecc.pcap sniffer-tls13-hrr.pcap sniffer-tls13-keylog.out sniffer-tls13-keylog.pcap sniffer-tls13-keylog.sslkeylog sniffer-tls13-x25519-resume.pcap sniffer-tls13-x25519.pcap stm32l4-v4_0_1_build.sh tls13.test trusted_peer.test unit.test.in user_settings_asm.shsrc
bio.c conf.c crl.c dtls.c dtls13.c include.am internal.c keys.c ocsp.c pk.c pk_ec.c pk_rsa.c quic.c sniffer.c ssl.c ssl_api_cert.c ssl_api_crl_ocsp.c ssl_api_pk.c ssl_asn1.c ssl_bn.c ssl_certman.c ssl_crypto.c ssl_ech.c ssl_load.c ssl_misc.c ssl_p7p12.c ssl_sess.c ssl_sk.c tls.c tls13.c wolfio.c x509.c x509_str.ctests
api
api.h api_decl.h create_ocsp_test_blobs.py include.am test_aes.c test_aes.h test_arc4.c test_arc4.h test_ascon.c test_ascon.h test_ascon_kats.h test_asn.c test_asn.h test_blake2.c test_blake2.h test_camellia.c test_camellia.h test_certman.c test_certman.h test_chacha.c test_chacha.h test_chacha20_poly1305.c test_chacha20_poly1305.h test_cmac.c test_cmac.h test_curve25519.c test_curve25519.h test_curve448.c test_curve448.h test_des3.c test_des3.h test_dh.c test_dh.h test_digest.h test_dsa.c test_dsa.h test_dtls.c test_dtls.h test_ecc.c test_ecc.h test_ed25519.c test_ed25519.h test_ed448.c test_ed448.h test_evp.c test_evp.h test_evp_cipher.c test_evp_cipher.h test_evp_digest.c test_evp_digest.h test_evp_pkey.c test_evp_pkey.h test_hash.c test_hash.h test_hmac.c test_hmac.h test_md2.c test_md2.h test_md4.c test_md4.h test_md5.c test_md5.h test_mldsa.c test_mldsa.h test_mlkem.c test_mlkem.h test_ocsp.c test_ocsp.h test_ocsp_test_blobs.h test_ossl_asn1.c test_ossl_asn1.h test_ossl_bio.c test_ossl_bio.h test_ossl_bn.c test_ossl_bn.h test_ossl_cipher.c test_ossl_cipher.h test_ossl_dgst.c test_ossl_dgst.h test_ossl_dh.c test_ossl_dh.h test_ossl_dsa.c test_ossl_dsa.h test_ossl_ec.c test_ossl_ec.h test_ossl_ecx.c test_ossl_ecx.h test_ossl_mac.c test_ossl_mac.h test_ossl_obj.c test_ossl_obj.h test_ossl_p7p12.c test_ossl_p7p12.h test_ossl_pem.c test_ossl_pem.h test_ossl_rand.c test_ossl_rand.h test_ossl_rsa.c test_ossl_rsa.h test_ossl_sk.c test_ossl_sk.h test_ossl_x509.c test_ossl_x509.h test_ossl_x509_acert.c test_ossl_x509_acert.h test_ossl_x509_crypto.c test_ossl_x509_crypto.h test_ossl_x509_ext.c test_ossl_x509_ext.h test_ossl_x509_info.c test_ossl_x509_info.h test_ossl_x509_io.c test_ossl_x509_io.h test_ossl_x509_lu.c test_ossl_x509_lu.h test_ossl_x509_name.c test_ossl_x509_name.h test_ossl_x509_pk.c test_ossl_x509_pk.h test_ossl_x509_str.c test_ossl_x509_str.h test_ossl_x509_vp.c test_ossl_x509_vp.h test_pkcs12.c test_pkcs12.h test_pkcs7.c test_pkcs7.h test_poly1305.c test_poly1305.h test_random.c test_random.h test_rc2.c test_rc2.h test_ripemd.c test_ripemd.h test_rsa.c test_rsa.h test_sha.c test_sha.h test_sha256.c test_sha256.h test_sha3.c test_sha3.h test_sha512.c test_sha512.h test_she.c test_she.h test_signature.c test_signature.h test_slhdsa.c test_slhdsa.h test_sm2.c test_sm2.h test_sm3.c test_sm3.h test_sm4.c test_sm4.h test_tls.c test_tls.h test_tls13.c test_tls13.h test_tls_ext.c test_tls_ext.h test_wc_encrypt.c test_wc_encrypt.h test_wolfmath.c test_wolfmath.h test_x509.c test_x509.hwolfcrypt
benchmark
README.md benchmark-VS2022.sln benchmark-VS2022.vcxproj benchmark-VS2022.vcxproj.user benchmark.c benchmark.h benchmark.sln benchmark.vcproj benchmark.vcxproj include.amsrc
port
Espressif
esp_crt_bundle
README.md cacrt_all.pem cacrt_deprecated.pem cacrt_local.pem esp_crt_bundle.c gen_crt_bundle.py pio_install_cryptography.pyRenesas
README.md renesas_common.c renesas_fspsm_aes.c renesas_fspsm_rsa.c renesas_fspsm_sha.c renesas_fspsm_util.c renesas_rx64_hw_sha.c renesas_rx64_hw_util.c renesas_tsip_aes.c renesas_tsip_rsa.c renesas_tsip_sha.c renesas_tsip_util.carm
armv8-32-aes-asm.S armv8-32-aes-asm_c.c armv8-32-chacha-asm.S armv8-32-chacha-asm_c.c armv8-32-curve25519.S armv8-32-curve25519_c.c armv8-32-mlkem-asm.S armv8-32-mlkem-asm_c.c armv8-32-poly1305-asm.S armv8-32-poly1305-asm_c.c armv8-32-sha256-asm.S armv8-32-sha256-asm_c.c armv8-32-sha3-asm.S armv8-32-sha3-asm_c.c armv8-32-sha512-asm.S armv8-32-sha512-asm_c.c armv8-aes-asm.S armv8-aes-asm_c.c armv8-aes.c armv8-chacha-asm.S armv8-chacha-asm_c.c armv8-curve25519.S armv8-curve25519_c.c armv8-mlkem-asm.S armv8-mlkem-asm_c.c armv8-poly1305-asm.S armv8-poly1305-asm_c.c armv8-sha256-asm.S armv8-sha256-asm_c.c armv8-sha256.c armv8-sha3-asm.S armv8-sha3-asm_c.c armv8-sha512-asm.S armv8-sha512-asm_c.c armv8-sha512.c cryptoCell.c cryptoCellHash.c thumb2-aes-asm.S thumb2-aes-asm_c.c thumb2-chacha-asm.S thumb2-chacha-asm_c.c thumb2-curve25519.S thumb2-curve25519_c.c thumb2-mlkem-asm.S thumb2-mlkem-asm_c.c thumb2-poly1305-asm.S thumb2-poly1305-asm_c.c thumb2-sha256-asm.S thumb2-sha256-asm_c.c thumb2-sha3-asm.S thumb2-sha3-asm_c.c thumb2-sha512-asm.S thumb2-sha512-asm_c.ccaam
README.md caam_aes.c caam_doc.pdf caam_driver.c caam_error.c caam_integrity.c caam_qnx.c caam_sha.c wolfcaam_aes.c wolfcaam_cmac.c wolfcaam_ecdsa.c wolfcaam_fsl_nxp.c wolfcaam_hash.c wolfcaam_hmac.c wolfcaam_init.c wolfcaam_qnx.c wolfcaam_rsa.c wolfcaam_seco.c wolfcaam_x25519.cdevcrypto
README.md devcrypto_aes.c devcrypto_ecdsa.c devcrypto_hash.c devcrypto_hmac.c devcrypto_rsa.c devcrypto_x25519.c wc_devcrypto.criscv
riscv-64-aes.c riscv-64-chacha.c riscv-64-poly1305.c riscv-64-sha256.c riscv-64-sha3.c riscv-64-sha512.cwolfssl
openssl
aes.h asn1.h asn1t.h bio.h bn.h buffer.h camellia.h cmac.h cms.h compat_types.h conf.h crypto.h des.h dh.h dsa.h ec.h ec25519.h ec448.h ecdh.h ecdsa.h ed25519.h ed448.h engine.h err.h evp.h fips_rand.h hmac.h include.am kdf.h lhash.h md4.h md5.h modes.h obj_mac.h objects.h ocsp.h opensslconf.h opensslv.h ossl_typ.h pem.h pkcs12.h pkcs7.h rand.h rc4.h ripemd.h rsa.h safestack.h sha.h sha3.h srp.h ssl.h ssl23.h stack.h tls1.h txt_db.h ui.h x509.h x509_vfy.h x509v3.hwolfcrypt
port
Renesas
renesas-fspsm-crypt.h renesas-fspsm-types.h renesas-rx64-hw-crypt.h renesas-tsip-crypt.h renesas_cmn.h renesas_fspsm_internal.h renesas_sync.h renesas_tsip_internal.h renesas_tsip_types.hcaam
caam_driver.h caam_error.h caam_qnx.h wolfcaam.h wolfcaam_aes.h wolfcaam_cmac.h wolfcaam_ecdsa.h wolfcaam_fsl_nxp.h wolfcaam_hash.h wolfcaam_qnx.h wolfcaam_rsa.h wolfcaam_seco.h wolfcaam_sha.h wolfcaam_x25519.hwrapper
Ada
examples
src
aes_verify_main.adb rsa_verify_main.adb sha256_main.adb spark_sockets.adb spark_sockets.ads spark_terminal.adb spark_terminal.ads tls_client.adb tls_client.ads tls_client_main.adb tls_server.adb tls_server.ads tls_server_main.adbtests
src
aes_bindings_tests.adb aes_bindings_tests.ads rsa_verify_bindings_tests.adb rsa_verify_bindings_tests.ads sha256_bindings_tests.adb sha256_bindings_tests.ads tests.adbCSharp
wolfSSL-Example-IOCallbacks
App.config wolfSSL-Example-IOCallbacks.cs wolfSSL-Example-IOCallbacks.csprojwolfSSL-TLS-ServerThreaded
App.config wolfSSL-TLS-ServerThreaded.cs wolfSSL-TLS-ServerThreaded.csprojrust
wolfssl-wolfcrypt
src
aes.rs blake2.rs chacha20_poly1305.rs cmac.rs cmac_mac.rs curve25519.rs dh.rs dilithium.rs ecc.rs ecdsa.rs ed25519.rs ed448.rs fips.rs hkdf.rs hmac.rs hmac_mac.rs kdf.rs lib.rs lms.rs mlkem.rs mlkem_kem.rs pbkdf2_password_hash.rs prf.rs random.rs rsa.rs rsa_pkcs1v15.rs sha.rs sha_digest.rs sys.rstests
test_aes.rs test_blake2.rs test_chacha20_poly1305.rs test_cmac.rs test_cmac_mac.rs test_curve25519.rs test_dh.rs test_dilithium.rs test_ecc.rs test_ecdsa.rs test_ed25519.rs test_ed448.rs test_hkdf.rs test_hmac.rs test_hmac_mac.rs test_kdf.rs test_lms.rs test_mlkem.rs test_mlkem_kem.rs test_pbkdf2_password_hash.rs test_prf.rs test_random.rs test_rsa.rs test_rsa_pkcs1v15.rs test_sha.rs test_sha_digest.rs test_wolfcrypt.rszephyr
samples
wolfssl_benchmark
CMakeLists.txt README install_test.sh prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.confwolfssl_test
CMakeLists.txt README install_test.sh prj-no-malloc.conf prj.conf sample.yaml zephyr_legacy.conf zephyr_v4.1.conf
luajit/src/lj_asm.c
raw
1/*
2** IR assembler (SSA IR -> machine code).
3** Copyright (C) 2005-2026 Mike Pall. See Copyright Notice in luajit.h
4*/
5
6#define lj_asm_c
7#define LUA_CORE
8
9#include "lj_obj.h"
10
11#if LJ_HASJIT
12
13#include "lj_gc.h"
14#include "lj_buf.h"
15#include "lj_str.h"
16#include "lj_tab.h"
17#include "lj_frame.h"
18#if LJ_HASFFI
19#include "lj_ctype.h"
20#endif
21#include "lj_ir.h"
22#include "lj_jit.h"
23#include "lj_ircall.h"
24#include "lj_iropt.h"
25#include "lj_mcode.h"
26#include "lj_trace.h"
27#include "lj_snap.h"
28#include "lj_asm.h"
29#include "lj_dispatch.h"
30#include "lj_vm.h"
31#include "lj_target.h"
32#include "lj_prng.h"
33
34#ifdef LUA_USE_ASSERT
35#include <stdio.h>
36#endif
37
38/* -- Assembler state and common macros ----------------------------------- */
39
40/* Assembler state. */
41typedef struct ASMState {
42 RegCost cost[RID_MAX]; /* Reference and blended allocation cost for regs. */
43
44 MCode *mcp; /* Current MCode pointer (grows down). */
45 MCode *mclim; /* Lower limit for MCode memory + red zone. */
46#ifdef LUA_USE_ASSERT
47 MCode *mcp_prev; /* Red zone overflow check. */
48#endif
49
50 IRIns *ir; /* Copy of pointer to IR instructions/constants. */
51 jit_State *J; /* JIT compiler state. */
52
53#if LJ_TARGET_X86ORX64
54 x86ModRM mrm; /* Fused x86 address operand. */
55#endif
56
57 RegSet freeset; /* Set of free registers. */
58 RegSet modset; /* Set of registers modified inside the loop. */
59 RegSet weakset; /* Set of weakly referenced registers. */
60 RegSet phiset; /* Set of PHI registers. */
61
62 uint32_t flags; /* Copy of JIT compiler flags. */
63 int loopinv; /* Loop branch inversion (0:no, 1:yes, 2:yes+CC_P). */
64
65 int32_t evenspill; /* Next even spill slot. */
66 int32_t oddspill; /* Next odd spill slot (or 0). */
67
68 IRRef curins; /* Reference of current instruction. */
69 IRRef stopins; /* Stop assembly before hitting this instruction. */
70 IRRef orignins; /* Original T->nins. */
71
72 IRRef snapref; /* Current snapshot is active after this reference. */
73 IRRef snaprename; /* Rename highwater mark for snapshot check. */
74 SnapNo snapno; /* Current snapshot number. */
75 SnapNo loopsnapno; /* Loop snapshot number. */
76 int snapalloc; /* Current snapshot needs allocation. */
77 BloomFilter snapfilt1, snapfilt2; /* Filled with snapshot refs. */
78
79 IRRef fuseref; /* Fusion limit (loopref, 0 or FUSE_DISABLED). */
80 IRRef sectref; /* Section base reference (loopref or 0). */
81 IRRef loopref; /* Reference of LOOP instruction (or 0). */
82
83 BCReg topslot; /* Number of slots for stack check (unless 0). */
84 int32_t gcsteps; /* Accumulated number of GC steps (per section). */
85
86 GCtrace *T; /* Trace to assemble. */
87 GCtrace *parent; /* Parent trace (or NULL). */
88
89 MCode *mcbot; /* Bottom of reserved MCode. */
90 MCode *mctop; /* Top of generated MCode. */
91 MCode *mctoporig; /* Original top of generated MCode. */
92 MCode *mcloop; /* Pointer to loop MCode (or NULL). */
93 MCode *invmcp; /* Points to invertible loop branch (or NULL). */
94 MCode *flagmcp; /* Pending opportunity to merge flag setting ins. */
95 MCode *realign; /* Realign loop if not NULL. */
96 MCode *mctail; /* Tail of trace before stack adjust + jmp. */
97#if LJ_TARGET_PPC || LJ_TARGET_ARM64
98 MCode *mcexit; /* Pointer to exit stubs. */
99#endif
100
101#ifdef LUAJIT_RANDOM_RA
102 /* Randomize register allocation. OK for fuzz testing, not for production. */
103 uint64_t prngbits;
104 PRNGState prngstate;
105#endif
106
107#ifdef RID_NUM_KREF
108 intptr_t krefk[RID_NUM_KREF];
109#endif
110 IRRef1 phireg[RID_MAX]; /* PHI register references. */
111 uint16_t parentmap[LJ_MAX_JSLOTS]; /* Parent instruction to RegSP map. */
112} ASMState;
113
114#ifdef LUA_USE_ASSERT
115#define lj_assertA(c, ...) lj_assertG_(J2G(as->J), (c), __VA_ARGS__)
116#else
117#define lj_assertA(c, ...) ((void)as)
118#endif
119
120#define IR(ref) (&as->ir[(ref)])
121
122#define ASMREF_TMP1 REF_TRUE /* Temp. register. */
123#define ASMREF_TMP2 REF_FALSE /* Temp. register. */
124#define ASMREF_L REF_NIL /* Stores register for L. */
125
126/* Check for variant to invariant references. */
127#define iscrossref(as, ref) ((ref) < as->sectref)
128
129/* Inhibit memory op fusion from variant to invariant references. */
130#define FUSE_DISABLED (~(IRRef)0)
131#define mayfuse(as, ref) ((ref) > as->fuseref)
132#define neverfuse(as) (as->fuseref == FUSE_DISABLED)
133#define canfuse(as, ir) (!neverfuse(as) && !irt_isphi((ir)->t))
134#define opisfusableload(o) \
135 ((o) == IR_ALOAD || (o) == IR_HLOAD || (o) == IR_ULOAD || \
136 (o) == IR_FLOAD || (o) == IR_XLOAD || (o) == IR_SLOAD || (o) == IR_VLOAD)
137
138/* Sparse limit checks using a red zone before the actual limit. */
139#define MCLIM_REDZONE 64
140
141static LJ_NORET LJ_NOINLINE void asm_mclimit(ASMState *as)
142{
143 lj_mcode_limiterr(as->J, (size_t)(as->mctop - as->mcp + 4*MCLIM_REDZONE));
144}
145
146static LJ_AINLINE void checkmclim(ASMState *as)
147{
148#ifdef LUA_USE_ASSERT
149 if (as->mcp + MCLIM_REDZONE < as->mcp_prev) {
150 IRIns *ir = IR(as->curins+1);
151 lj_assertA(0, "red zone overflow: %p IR %04d %02d %04d %04d\n", as->mcp,
152 as->curins+1-REF_BIAS, ir->o, ir->op1-REF_BIAS, ir->op2-REF_BIAS);
153 }
154#endif
155 if (LJ_UNLIKELY(as->mcp < as->mclim)) asm_mclimit(as);
156#ifdef LUA_USE_ASSERT
157 as->mcp_prev = as->mcp;
158#endif
159}
160
161#ifdef RID_NUM_KREF
162#define ra_iskref(ref) ((ref) < RID_NUM_KREF)
163#define ra_krefreg(ref) ((Reg)(RID_MIN_KREF + (Reg)(ref)))
164#define ra_krefk(as, ref) (as->krefk[(ref)])
165
166static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, intptr_t k)
167{
168 IRRef ref = (IRRef)(r - RID_MIN_KREF);
169 as->krefk[ref] = k;
170 as->cost[r] = REGCOST(ref, ref);
171}
172
173#else
174#define ra_iskref(ref) 0
175#define ra_krefreg(ref) RID_MIN_GPR
176#define ra_krefk(as, ref) 0
177#endif
178
179/* Arch-specific field offsets. */
180static const uint8_t field_ofs[IRFL__MAX+1] = {
181#define FLOFS(name, ofs) (uint8_t)(ofs),
182IRFLDEF(FLOFS)
183#undef FLOFS
184 0
185};
186
187#ifdef LUAJIT_RANDOM_RA
188/* Return a fixed number of random bits from the local PRNG state. */
189static uint32_t ra_random_bits(ASMState *as, uint32_t nbits) {
190 uint64_t b = as->prngbits;
191 uint32_t res = (1u << nbits) - 1u;
192 if (b <= res) b = lj_prng_u64(&as->prngstate) | (1ull << 63);
193 res &= (uint32_t)b;
194 as->prngbits = b >> nbits;
195 return res;
196}
197
198/* Pick a random register from a register set. */
199static Reg rset_pickrandom(ASMState *as, RegSet rs)
200{
201 Reg r = rset_pickbot_(rs);
202 rs >>= r;
203 if (rs > 1) { /* More than one bit set? */
204 while (1) {
205 /* We need to sample max. the GPR or FPR half of the set. */
206 uint32_t d = ra_random_bits(as, RSET_BITS-1);
207 if ((rs >> d) & 1) {
208 r += d;
209 break;
210 }
211 }
212 }
213 return r;
214}
215#define rset_picktop(rs) rset_pickrandom(as, rs)
216#define rset_pickbot(rs) rset_pickrandom(as, rs)
217#else
218#define rset_picktop(rs) rset_picktop_(rs)
219#define rset_pickbot(rs) rset_pickbot_(rs)
220#endif
221
222/* -- Target-specific instruction emitter --------------------------------- */
223
224#if LJ_TARGET_X86ORX64
225#include "lj_emit_x86.h"
226#elif LJ_TARGET_ARM
227#include "lj_emit_arm.h"
228#elif LJ_TARGET_ARM64
229#include "lj_emit_arm64.h"
230#elif LJ_TARGET_PPC
231#include "lj_emit_ppc.h"
232#elif LJ_TARGET_MIPS
233#include "lj_emit_mips.h"
234#else
235#error "Missing instruction emitter for target CPU"
236#endif
237
238/* Generic load/store of register from/to stack slot. */
239#define emit_spload(as, ir, r, ofs) \
240 emit_loadofs(as, ir, (r), RID_SP, (ofs))
241#define emit_spstore(as, ir, r, ofs) \
242 emit_storeofs(as, ir, (r), RID_SP, (ofs))
243
244/* -- Register allocator debugging ---------------------------------------- */
245
246/* #define LUAJIT_DEBUG_RA */
247
248#ifdef LUAJIT_DEBUG_RA
249
250#include <stdio.h>
251#include <stdarg.h>
252
253#define RIDNAME(name) #name,
254static const char *const ra_regname[] = {
255 GPRDEF(RIDNAME)
256 FPRDEF(RIDNAME)
257 VRIDDEF(RIDNAME)
258 NULL
259};
260#undef RIDNAME
261
262static char ra_dbg_buf[65536];
263static char *ra_dbg_p;
264static char *ra_dbg_merge;
265static MCode *ra_dbg_mcp;
266
267static void ra_dstart(void)
268{
269 ra_dbg_p = ra_dbg_buf;
270 ra_dbg_merge = NULL;
271 ra_dbg_mcp = NULL;
272}
273
274static void ra_dflush(void)
275{
276 fwrite(ra_dbg_buf, 1, (size_t)(ra_dbg_p-ra_dbg_buf), stdout);
277 ra_dstart();
278}
279
280static void ra_dprintf(ASMState *as, const char *fmt, ...)
281{
282 char *p;
283 va_list argp;
284 va_start(argp, fmt);
285 p = ra_dbg_mcp == as->mcp ? ra_dbg_merge : ra_dbg_p;
286 ra_dbg_mcp = NULL;
287 p += sprintf(p, "%08x \e[36m%04d ", (uintptr_t)as->mcp, as->curins-REF_BIAS);
288 for (;;) {
289 const char *e = strchr(fmt, '$');
290 if (e == NULL) break;
291 memcpy(p, fmt, (size_t)(e-fmt));
292 p += e-fmt;
293 if (e[1] == 'r') {
294 Reg r = va_arg(argp, Reg) & RID_MASK;
295 if (r <= RID_MAX) {
296 const char *q;
297 for (q = ra_regname[r]; *q; q++)
298 *p++ = *q >= 'A' && *q <= 'Z' ? *q + 0x20 : *q;
299 } else {
300 *p++ = '?';
301 lj_assertA(0, "bad register %d for debug format \"%s\"", r, fmt);
302 }
303 } else if (e[1] == 'f' || e[1] == 'i') {
304 IRRef ref;
305 if (e[1] == 'f')
306 ref = va_arg(argp, IRRef);
307 else
308 ref = va_arg(argp, IRIns *) - as->ir;
309 if (ref >= REF_BIAS)
310 p += sprintf(p, "%04d", ref - REF_BIAS);
311 else
312 p += sprintf(p, "K%03d", REF_BIAS - ref);
313 } else if (e[1] == 's') {
314 uint32_t slot = va_arg(argp, uint32_t);
315 p += sprintf(p, "[sp+0x%x]", sps_scale(slot));
316 } else if (e[1] == 'x') {
317 p += sprintf(p, "%08x", va_arg(argp, int32_t));
318 } else {
319 lj_assertA(0, "bad debug format code");
320 }
321 fmt = e+2;
322 }
323 va_end(argp);
324 while (*fmt)
325 *p++ = *fmt++;
326 *p++ = '\e'; *p++ = '['; *p++ = 'm'; *p++ = '\n';
327 if (p > ra_dbg_buf+sizeof(ra_dbg_buf)-256) {
328 fwrite(ra_dbg_buf, 1, (size_t)(p-ra_dbg_buf), stdout);
329 p = ra_dbg_buf;
330 }
331 ra_dbg_p = p;
332}
333
334#define RA_DBG_START() ra_dstart()
335#define RA_DBG_FLUSH() ra_dflush()
336#define RA_DBG_REF() \
337 do { char *_p = ra_dbg_p; ra_dprintf(as, ""); \
338 ra_dbg_merge = _p; ra_dbg_mcp = as->mcp; } while (0)
339#define RA_DBGX(x) ra_dprintf x
340
341#else
342#define RA_DBG_START() ((void)0)
343#define RA_DBG_FLUSH() ((void)0)
344#define RA_DBG_REF() ((void)0)
345#define RA_DBGX(x) ((void)0)
346#endif
347
348/* -- Register allocator -------------------------------------------------- */
349
350#define ra_free(as, r) rset_set(as->freeset, (r))
351#define ra_modified(as, r) rset_set(as->modset, (r))
352#define ra_weak(as, r) rset_set(as->weakset, (r))
353#define ra_noweak(as, r) rset_clear(as->weakset, (r))
354
355#define ra_used(ir) (ra_hasreg((ir)->r) || ra_hasspill((ir)->s))
356
357/* Setup register allocator. */
358static void ra_setup(ASMState *as)
359{
360 Reg r;
361 /* Initially all regs (except the stack pointer) are free for use. */
362 as->freeset = RSET_INIT;
363 as->modset = RSET_EMPTY;
364 as->weakset = RSET_EMPTY;
365 as->phiset = RSET_EMPTY;
366 memset(as->phireg, 0, sizeof(as->phireg));
367 for (r = RID_MIN_GPR; r < RID_MAX; r++)
368 as->cost[r] = REGCOST(~0u, 0u);
369}
370
371/* Rematerialize constants. */
372static Reg ra_rematk(ASMState *as, IRRef ref)
373{
374 IRIns *ir;
375 Reg r;
376 if (ra_iskref(ref)) {
377 r = ra_krefreg(ref);
378 lj_assertA(!rset_test(as->freeset, r), "rematk of free reg %d", r);
379 ra_free(as, r);
380 ra_modified(as, r);
381#if LJ_64
382 emit_loadu64(as, r, ra_krefk(as, ref));
383#else
384 emit_loadi(as, r, ra_krefk(as, ref));
385#endif
386 return r;
387 }
388 ir = IR(ref);
389 r = ir->r;
390 lj_assertA(ra_hasreg(r), "rematk of K%03d has no reg", REF_BIAS - ref);
391 lj_assertA(!ra_hasspill(ir->s),
392 "rematk of K%03d has spill slot [%x]", REF_BIAS - ref, ir->s);
393 ra_free(as, r);
394 ra_modified(as, r);
395 ir->r = RID_INIT; /* Do not keep any hint. */
396 RA_DBGX((as, "remat $i $r", ir, r));
397#if !LJ_SOFTFP32
398 if (ir->o == IR_KNUM) {
399 emit_loadk64(as, r, ir);
400 } else
401#endif
402 if (emit_canremat(REF_BASE) && ir->o == IR_BASE) {
403 ra_sethint(ir->r, RID_BASE); /* Restore BASE register hint. */
404 emit_getgl(as, r, jit_base);
405 } else if (emit_canremat(ASMREF_L) && ir->o == IR_KPRI) {
406 /* REF_NIL stores ASMREF_L register. */
407 lj_assertA(irt_isnil(ir->t), "rematk of bad ASMREF_L");
408 emit_getgl(as, r, cur_L);
409#if LJ_64
410 } else if (ir->o == IR_KINT64) {
411 emit_loadu64(as, r, ir_kint64(ir)->u64);
412#if LJ_GC64
413 } else if (ir->o == IR_KGC) {
414 emit_loadu64(as, r, (uintptr_t)ir_kgc(ir));
415 } else if (ir->o == IR_KPTR || ir->o == IR_KKPTR) {
416 emit_loadu64(as, r, (uintptr_t)ir_kptr(ir));
417#endif
418#endif
419 } else {
420 lj_assertA(ir->o == IR_KINT || ir->o == IR_KGC ||
421 ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL,
422 "rematk of bad IR op %d", ir->o);
423 emit_loadi(as, r, ir->i);
424 }
425 return r;
426}
427
428/* Force a spill. Allocate a new spill slot if needed. */
429static int32_t ra_spill(ASMState *as, IRIns *ir)
430{
431 int32_t slot = ir->s;
432 lj_assertA(ir >= as->ir + REF_TRUE,
433 "spill of K%03d", REF_BIAS - (int)(ir - as->ir));
434 if (!ra_hasspill(slot)) {
435 if (irt_is64(ir->t)) {
436 slot = as->evenspill;
437 as->evenspill += 2;
438 } else if (as->oddspill) {
439 slot = as->oddspill;
440 as->oddspill = 0;
441 } else {
442 slot = as->evenspill;
443 as->oddspill = slot+1;
444 as->evenspill += 2;
445 }
446 if (as->evenspill > 256)
447 lj_trace_err(as->J, LJ_TRERR_SPILLOV);
448 ir->s = (uint8_t)slot;
449 }
450 return sps_scale(slot);
451}
452
453/* Release the temporarily allocated register in ASMREF_TMP1/ASMREF_TMP2. */
454static Reg ra_releasetmp(ASMState *as, IRRef ref)
455{
456 IRIns *ir = IR(ref);
457 Reg r = ir->r;
458 lj_assertA(ra_hasreg(r), "release of TMP%d has no reg", ref-ASMREF_TMP1+1);
459 lj_assertA(!ra_hasspill(ir->s),
460 "release of TMP%d has spill slot [%x]", ref-ASMREF_TMP1+1, ir->s);
461 ra_free(as, r);
462 ra_modified(as, r);
463 ir->r = RID_INIT;
464 return r;
465}
466
467/* Restore a register (marked as free). Rematerialize or force a spill. */
468static Reg ra_restore(ASMState *as, IRRef ref)
469{
470 if (emit_canremat(ref)) {
471 return ra_rematk(as, ref);
472 } else {
473 IRIns *ir = IR(ref);
474 int32_t ofs = ra_spill(as, ir); /* Force a spill slot. */
475 Reg r = ir->r;
476 lj_assertA(ra_hasreg(r), "restore of IR %04d has no reg", ref - REF_BIAS);
477 ra_sethint(ir->r, r); /* Keep hint. */
478 ra_free(as, r);
479 if (!rset_test(as->weakset, r)) { /* Only restore non-weak references. */
480 ra_modified(as, r);
481 RA_DBGX((as, "restore $i $r", ir, r));
482 emit_spload(as, ir, r, ofs);
483 }
484 return r;
485 }
486}
487
488/* Save a register to a spill slot. */
489static void ra_save(ASMState *as, IRIns *ir, Reg r)
490{
491 RA_DBGX((as, "save $i $r", ir, r));
492 emit_spstore(as, ir, r, sps_scale(ir->s));
493}
494
495#define MINCOST(name) \
496 if (rset_test(RSET_ALL, RID_##name) && \
497 LJ_LIKELY(allow&RID2RSET(RID_##name)) && as->cost[RID_##name] < cost) \
498 cost = as->cost[RID_##name];
499
500/* Evict the register with the lowest cost, forcing a restore. */
501static Reg ra_evict(ASMState *as, RegSet allow)
502{
503 IRRef ref;
504 RegCost cost = ~(RegCost)0;
505 lj_assertA(allow != RSET_EMPTY, "evict from empty set");
506 if (RID_NUM_FPR == 0 || allow < RID2RSET(RID_MAX_GPR)) {
507 GPRDEF(MINCOST)
508 } else {
509 FPRDEF(MINCOST)
510 }
511 ref = regcost_ref(cost);
512 lj_assertA(ra_iskref(ref) || (ref >= as->T->nk && ref < as->T->nins),
513 "evict of out-of-range IR %04d", ref - REF_BIAS);
514 /* Preferably pick any weak ref instead of a non-weak, non-const ref. */
515 if (!irref_isk(ref) && (as->weakset & allow)) {
516 IRIns *ir = IR(ref);
517 if (!rset_test(as->weakset, ir->r))
518 ref = regcost_ref(as->cost[rset_pickbot((as->weakset & allow))]);
519 }
520 return ra_restore(as, ref);
521}
522
523/* Pick any register (marked as free). Evict on-demand. */
524static Reg ra_pick(ASMState *as, RegSet allow)
525{
526 RegSet pick = as->freeset & allow;
527 if (!pick)
528 return ra_evict(as, allow);
529 else
530 return rset_picktop(pick);
531}
532
533/* Get a scratch register (marked as free). */
534static Reg ra_scratch(ASMState *as, RegSet allow)
535{
536 Reg r = ra_pick(as, allow);
537 ra_modified(as, r);
538 RA_DBGX((as, "scratch $r", r));
539 return r;
540}
541
542/* Evict all registers from a set (if not free). */
543static void ra_evictset(ASMState *as, RegSet drop)
544{
545 RegSet work;
546 as->modset |= drop;
547#if !LJ_SOFTFP
548 work = (drop & ~as->freeset) & RSET_FPR;
549 while (work) {
550 Reg r = rset_pickbot(work);
551 ra_restore(as, regcost_ref(as->cost[r]));
552 rset_clear(work, r);
553 checkmclim(as);
554 }
555#endif
556 work = (drop & ~as->freeset);
557 while (work) {
558 Reg r = rset_pickbot(work);
559 ra_restore(as, regcost_ref(as->cost[r]));
560 rset_clear(work, r);
561 checkmclim(as);
562 }
563}
564
565/* Evict (rematerialize) all registers allocated to constants. */
566static void ra_evictk(ASMState *as)
567{
568 RegSet work;
569#if !LJ_SOFTFP
570 work = ~as->freeset & RSET_FPR;
571 while (work) {
572 Reg r = rset_pickbot(work);
573 IRRef ref = regcost_ref(as->cost[r]);
574 if (emit_canremat(ref) && irref_isk(ref)) {
575 ra_rematk(as, ref);
576 checkmclim(as);
577 }
578 rset_clear(work, r);
579 }
580#endif
581 work = ~as->freeset & RSET_GPR;
582 while (work) {
583 Reg r = rset_pickbot(work);
584 IRRef ref = regcost_ref(as->cost[r]);
585 if (emit_canremat(ref) && irref_isk(ref)) {
586 ra_rematk(as, ref);
587 checkmclim(as);
588 }
589 rset_clear(work, r);
590 }
591}
592
593#ifdef RID_NUM_KREF
594/* Allocate a register for a constant. */
595static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow)
596{
597 /* First try to find a register which already holds the same constant. */
598 RegSet pick, work = ~as->freeset & RSET_GPR;
599 Reg r;
600 while (work) {
601 IRRef ref;
602 r = rset_pickbot(work);
603 ref = regcost_ref(as->cost[r]);
604#if LJ_64
605 if (ref < ASMREF_L) {
606 if (ra_iskref(ref)) {
607 if (k == ra_krefk(as, ref))
608 return r;
609 } else {
610 IRIns *ir = IR(ref);
611 if ((ir->o == IR_KINT64 && k == (int64_t)ir_kint64(ir)->u64) ||
612#if LJ_GC64
613#if LJ_TARGET_ARM64
614 (ir->o == IR_KINT && (uint64_t)k == (uint32_t)ir->i) ||
615#else
616 (ir->o == IR_KINT && k == ir->i) ||
617#endif
618 (ir->o == IR_KGC && k == (intptr_t)ir_kgc(ir)) ||
619 ((ir->o == IR_KPTR || ir->o == IR_KKPTR) &&
620 k == (intptr_t)ir_kptr(ir))
621#else
622 (ir->o != IR_KINT64 && k == ir->i)
623#endif
624 )
625 return r;
626 }
627 }
628#else
629 if (ref < ASMREF_L &&
630 k == (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i))
631 return r;
632#endif
633 rset_clear(work, r);
634 }
635 pick = as->freeset & allow;
636 if (pick) {
637 /* Constants should preferably get unmodified registers. */
638 if ((pick & ~as->modset))
639 pick &= ~as->modset;
640 r = rset_pickbot(pick); /* Reduce conflicts with inverse allocation. */
641 } else {
642 r = ra_evict(as, allow);
643 }
644 RA_DBGX((as, "allock $x $r", k, r));
645 ra_setkref(as, r, k);
646 rset_clear(as->freeset, r);
647 ra_noweak(as, r);
648 return r;
649}
650
651/* Allocate a specific register for a constant. */
652static void ra_allockreg(ASMState *as, intptr_t k, Reg r)
653{
654 Reg kr = ra_allock(as, k, RID2RSET(r));
655 if (kr != r) {
656 IRIns irdummy;
657 irdummy.t.irt = IRT_INT;
658 ra_scratch(as, RID2RSET(r));
659 emit_movrr(as, &irdummy, r, kr);
660 }
661}
662#else
663#define ra_allockreg(as, k, r) emit_loadi(as, (r), (k))
664#endif
665
666/* Allocate a register for ref from the allowed set of registers.
667** Note: this function assumes the ref does NOT have a register yet!
668** Picks an optimal register, sets the cost and marks the register as non-free.
669*/
670static Reg ra_allocref(ASMState *as, IRRef ref, RegSet allow)
671{
672 IRIns *ir = IR(ref);
673 RegSet pick = as->freeset & allow;
674 Reg r;
675 lj_assertA(ra_noreg(ir->r),
676 "IR %04d already has reg %d", ref - REF_BIAS, ir->r);
677 if (pick) {
678 /* First check register hint from propagation or PHI. */
679 if (ra_hashint(ir->r)) {
680 r = ra_gethint(ir->r);
681 if (rset_test(pick, r)) /* Use hint register if possible. */
682 goto found;
683 /* Rematerialization is cheaper than missing a hint. */
684 if (rset_test(allow, r) && emit_canremat(regcost_ref(as->cost[r]))) {
685 ra_rematk(as, regcost_ref(as->cost[r]));
686 goto found;
687 }
688 RA_DBGX((as, "hintmiss $f $r", ref, r));
689 }
690 /* Invariants should preferably get unmodified registers. */
691 if (ref < as->loopref && !irt_isphi(ir->t)) {
692 if ((pick & ~as->modset))
693 pick &= ~as->modset;
694 r = rset_pickbot(pick); /* Reduce conflicts with inverse allocation. */
695 } else {
696 /* We've got plenty of regs, so get callee-save regs if possible. */
697 if (RID_NUM_GPR > 8 && (pick & ~RSET_SCRATCH))
698 pick &= ~RSET_SCRATCH;
699 r = rset_picktop(pick);
700 }
701 } else {
702 r = ra_evict(as, allow);
703 }
704found:
705 RA_DBGX((as, "alloc $f $r", ref, r));
706 ir->r = (uint8_t)r;
707 rset_clear(as->freeset, r);
708 ra_noweak(as, r);
709 as->cost[r] = REGCOST_REF_T(ref, irt_t(ir->t));
710 return r;
711}
712
713/* Allocate a register on-demand. */
714static Reg ra_alloc1(ASMState *as, IRRef ref, RegSet allow)
715{
716 Reg r = IR(ref)->r;
717 /* Note: allow is ignored if the register is already allocated. */
718 if (ra_noreg(r)) r = ra_allocref(as, ref, allow);
719 ra_noweak(as, r);
720 return r;
721}
722
723/* Add a register rename to the IR. */
724static void ra_addrename(ASMState *as, Reg down, IRRef ref, SnapNo snapno)
725{
726 IRRef ren;
727 lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), ref, snapno);
728 ren = tref_ref(lj_ir_emit(as->J));
729 as->J->cur.ir[ren].r = (uint8_t)down;
730 as->J->cur.ir[ren].s = SPS_NONE;
731}
732
733/* Rename register allocation and emit move. */
734static void ra_rename(ASMState *as, Reg down, Reg up)
735{
736 IRRef ref = regcost_ref(as->cost[up] = as->cost[down]);
737 IRIns *ir = IR(ref);
738 ir->r = (uint8_t)up;
739 as->cost[down] = 0;
740 lj_assertA((down < RID_MAX_GPR) == (up < RID_MAX_GPR),
741 "rename between GPR/FPR %d and %d", down, up);
742 lj_assertA(!rset_test(as->freeset, down), "rename from free reg %d", down);
743 lj_assertA(rset_test(as->freeset, up), "rename to non-free reg %d", up);
744 ra_free(as, down); /* 'down' is free ... */
745 ra_modified(as, down);
746 rset_clear(as->freeset, up); /* ... and 'up' is now allocated. */
747 ra_noweak(as, up);
748 RA_DBGX((as, "rename $f $r $r", regcost_ref(as->cost[up]), down, up));
749 emit_movrr(as, ir, down, up); /* Backwards codegen needs inverse move. */
750 if (!ra_hasspill(IR(ref)->s)) { /* Add the rename to the IR. */
751 /*
752 ** The rename is effective at the subsequent (already emitted) exit
753 ** branch. This is for the current snapshot (as->snapno). Except if we
754 ** haven't yet allocated any refs for the snapshot (as->snapalloc == 1),
755 ** then it belongs to the next snapshot.
756 ** See also the discussion at asm_snap_checkrename().
757 */
758 ra_addrename(as, down, ref, as->snapno + as->snapalloc);
759 }
760}
761
762/* Pick a destination register (marked as free).
763** Caveat: allow is ignored if there's already a destination register.
764** Use ra_destreg() to get a specific register.
765*/
766static Reg ra_dest(ASMState *as, IRIns *ir, RegSet allow)
767{
768 Reg dest = ir->r;
769 if (ra_hasreg(dest)) {
770 ra_free(as, dest);
771 ra_modified(as, dest);
772 } else {
773 if (ra_hashint(dest) && rset_test((as->freeset&allow), ra_gethint(dest))) {
774 dest = ra_gethint(dest);
775 ra_modified(as, dest);
776 RA_DBGX((as, "dest $r", dest));
777 } else {
778 dest = ra_scratch(as, allow);
779 }
780 ir->r = dest;
781 }
782 if (LJ_UNLIKELY(ra_hasspill(ir->s))) ra_save(as, ir, dest);
783 return dest;
784}
785
786/* Force a specific destination register (marked as free). */
787static void ra_destreg(ASMState *as, IRIns *ir, Reg r)
788{
789 Reg dest = ra_dest(as, ir, RID2RSET(r));
790 if (dest != r) {
791 lj_assertA(rset_test(as->freeset, r), "dest reg %d is not free", r);
792 ra_modified(as, r);
793 emit_movrr(as, ir, dest, r);
794 }
795}
796
797#if LJ_TARGET_X86ORX64
798/* Propagate dest register to left reference. Emit moves as needed.
799** This is a required fixup step for all 2-operand machine instructions.
800*/
801static void ra_left(ASMState *as, Reg dest, IRRef lref)
802{
803 IRIns *ir = IR(lref);
804 Reg left = ir->r;
805 if (ra_noreg(left)) {
806 if (irref_isk(lref)) {
807 if (ir->o == IR_KNUM) {
808 /* FP remat needs a load except for +0. Still better than eviction. */
809 if (tvispzero(ir_knum(ir)) || !(as->freeset & RSET_FPR)) {
810 emit_loadk64(as, dest, ir);
811 return;
812 }
813#if LJ_64
814 } else if (ir->o == IR_KINT64) {
815 emit_loadk64(as, dest, ir);
816 return;
817#if LJ_GC64
818 } else if (ir->o == IR_KGC || ir->o == IR_KPTR || ir->o == IR_KKPTR) {
819 emit_loadk64(as, dest, ir);
820 return;
821#endif
822#endif
823 } else if (ir->o != IR_KPRI) {
824 lj_assertA(ir->o == IR_KINT || ir->o == IR_KGC ||
825 ir->o == IR_KPTR || ir->o == IR_KKPTR || ir->o == IR_KNULL,
826 "K%03d has bad IR op %d", REF_BIAS - lref, ir->o);
827 emit_loadi(as, dest, ir->i);
828 return;
829 }
830 }
831 if (!ra_hashint(left) && !iscrossref(as, lref))
832 ra_sethint(ir->r, dest); /* Propagate register hint. */
833 left = ra_allocref(as, lref, dest < RID_MAX_GPR ? RSET_GPR : RSET_FPR);
834 }
835 ra_noweak(as, left);
836 /* Move needed for true 3-operand instruction: y=a+b ==> y=a; y+=b. */
837 if (dest != left) {
838 /* Use register renaming if dest is the PHI reg. */
839 if (irt_isphi(ir->t) && as->phireg[dest] == lref) {
840 ra_modified(as, left);
841 ra_rename(as, left, dest);
842 } else {
843 emit_movrr(as, ir, dest, left);
844 }
845 }
846}
847#else
848/* Similar to ra_left, except we override any hints. */
849static void ra_leftov(ASMState *as, Reg dest, IRRef lref)
850{
851 IRIns *ir = IR(lref);
852 Reg left = ir->r;
853 if (ra_noreg(left)) {
854 ra_sethint(ir->r, dest); /* Propagate register hint. */
855 left = ra_allocref(as, lref,
856 (LJ_SOFTFP || dest < RID_MAX_GPR) ? RSET_GPR : RSET_FPR);
857 }
858 ra_noweak(as, left);
859 if (dest != left) {
860 /* Use register renaming if dest is the PHI reg. */
861 if (irt_isphi(ir->t) && as->phireg[dest] == lref) {
862 ra_modified(as, left);
863 ra_rename(as, left, dest);
864 } else {
865 emit_movrr(as, ir, dest, left);
866 }
867 }
868}
869#endif
870
871/* Force a RID_RETLO/RID_RETHI destination register pair (marked as free). */
872static void ra_destpair(ASMState *as, IRIns *ir)
873{
874 Reg destlo = ir->r, desthi = (ir+1)->r;
875 IRIns *irx = (LJ_64 && !irt_is64(ir->t)) ? ir+1 : ir;
876 /* First spill unrelated refs blocking the destination registers. */
877 if (!rset_test(as->freeset, RID_RETLO) &&
878 destlo != RID_RETLO && desthi != RID_RETLO)
879 ra_restore(as, regcost_ref(as->cost[RID_RETLO]));
880 if (!rset_test(as->freeset, RID_RETHI) &&
881 destlo != RID_RETHI && desthi != RID_RETHI)
882 ra_restore(as, regcost_ref(as->cost[RID_RETHI]));
883 /* Next free the destination registers (if any). */
884 if (ra_hasreg(destlo)) {
885 ra_free(as, destlo);
886 ra_modified(as, destlo);
887 } else {
888 destlo = RID_RETLO;
889 }
890 if (ra_hasreg(desthi)) {
891 ra_free(as, desthi);
892 ra_modified(as, desthi);
893 } else {
894 desthi = RID_RETHI;
895 }
896 /* Check for conflicts and shuffle the registers as needed. */
897 if (destlo == RID_RETHI) {
898 if (desthi == RID_RETLO) {
899#if LJ_TARGET_X86ORX64
900 *--as->mcp = XI_XCHGa + RID_RETHI;
901 if (LJ_64 && irt_is64(irx->t)) *--as->mcp = 0x48;
902#else
903 emit_movrr(as, irx, RID_RETHI, RID_TMP);
904 emit_movrr(as, irx, RID_RETLO, RID_RETHI);
905 emit_movrr(as, irx, RID_TMP, RID_RETLO);
906#endif
907 } else {
908 emit_movrr(as, irx, RID_RETHI, RID_RETLO);
909 if (desthi != RID_RETHI) emit_movrr(as, irx, desthi, RID_RETHI);
910 }
911 } else if (desthi == RID_RETLO) {
912 emit_movrr(as, irx, RID_RETLO, RID_RETHI);
913 if (destlo != RID_RETLO) emit_movrr(as, irx, destlo, RID_RETLO);
914 } else {
915 if (desthi != RID_RETHI) emit_movrr(as, irx, desthi, RID_RETHI);
916 if (destlo != RID_RETLO) emit_movrr(as, irx, destlo, RID_RETLO);
917 }
918 /* Restore spill slots (if any). */
919 if (ra_hasspill((ir+1)->s)) ra_save(as, ir+1, RID_RETHI);
920 if (ra_hasspill(ir->s)) ra_save(as, ir, RID_RETLO);
921}
922
923/* -- Snapshot handling --------- ----------------------------------------- */
924
925/* Can we rematerialize a KNUM instead of forcing a spill? */
926static int asm_snap_canremat(ASMState *as)
927{
928 Reg r;
929 for (r = RID_MIN_FPR; r < RID_MAX_FPR; r++)
930 if (irref_isk(regcost_ref(as->cost[r])))
931 return 1;
932 return 0;
933}
934
935/* Check whether a sunk store corresponds to an allocation. */
936static int asm_sunk_store(ASMState *as, IRIns *ira, IRIns *irs)
937{
938 if (irs->s == 255) {
939 if (irs->o == IR_ASTORE || irs->o == IR_HSTORE ||
940 irs->o == IR_FSTORE || irs->o == IR_XSTORE) {
941 IRIns *irk = IR(irs->op1);
942 if (irk->o == IR_AREF || irk->o == IR_HREFK)
943 irk = IR(irk->op1);
944 return (IR(irk->op1) == ira);
945 }
946 return 0;
947 } else {
948 return (ira + irs->s == irs); /* Quick check. */
949 }
950}
951
952/* Allocate register or spill slot for a ref that escapes to a snapshot. */
953static void asm_snap_alloc1(ASMState *as, IRRef ref)
954{
955 IRIns *ir = IR(ref);
956 if (!irref_isk(ref)) {
957 bloomset(as->snapfilt1, ref);
958 bloomset(as->snapfilt2, hashrot(ref, ref + HASH_BIAS));
959 if (ra_used(ir)) return;
960 if (ir->r == RID_SINK || ir->r == RID_SUNK) {
961 ir->r = RID_SUNK;
962#if LJ_HASFFI
963 if (ir->o == IR_CNEWI) { /* Allocate CNEWI value. */
964 asm_snap_alloc1(as, ir->op2);
965 if (LJ_32 && (ir+1)->o == IR_HIOP)
966 asm_snap_alloc1(as, (ir+1)->op2);
967 } else
968#endif
969 { /* Allocate stored values for TNEW, TDUP and CNEW. */
970 IRIns *irs;
971 lj_assertA(ir->o == IR_TNEW || ir->o == IR_TDUP || ir->o == IR_CNEW,
972 "sink of IR %04d has bad op %d", ref - REF_BIAS, ir->o);
973 for (irs = IR(as->snapref-1); irs > ir; irs--)
974 if (irs->r == RID_SINK && asm_sunk_store(as, ir, irs)) {
975 lj_assertA(irs->o == IR_ASTORE || irs->o == IR_HSTORE ||
976 irs->o == IR_FSTORE || irs->o == IR_XSTORE,
977 "sunk store IR %04d has bad op %d",
978 (int)(irs - as->ir) - REF_BIAS, irs->o);
979 asm_snap_alloc1(as, irs->op2);
980 if (LJ_32 && (irs+1)->o == IR_HIOP)
981 asm_snap_alloc1(as, (irs+1)->op2);
982 }
983 }
984 } else {
985 RegSet allow;
986 if (ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT) {
987 IRIns *irc;
988 for (irc = IR(as->curins); irc > ir; irc--)
989 if ((irc->op1 == ref || irc->op2 == ref) &&
990 !(irc->r == RID_SINK || irc->r == RID_SUNK))
991 goto nosink; /* Don't sink conversion if result is used. */
992 asm_snap_alloc1(as, ir->op1);
993 return;
994 }
995 nosink:
996 allow = (!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR;
997 if ((as->freeset & allow) ||
998 (allow == RSET_FPR && asm_snap_canremat(as))) {
999 /* Get a weak register if we have a free one or can rematerialize. */
1000 Reg r = ra_allocref(as, ref, allow); /* Allocate a register. */
1001 if (!irt_isphi(ir->t))
1002 ra_weak(as, r); /* But mark it as weakly referenced. */
1003 checkmclim(as);
1004 RA_DBGX((as, "snapreg $f $r", ref, ir->r));
1005 } else {
1006 ra_spill(as, ir); /* Otherwise force a spill slot. */
1007 RA_DBGX((as, "snapspill $f $s", ref, ir->s));
1008 }
1009 }
1010 }
1011}
1012
1013/* Allocate refs escaping to a snapshot. */
1014static void asm_snap_alloc(ASMState *as, int snapno)
1015{
1016 SnapShot *snap = &as->T->snap[snapno];
1017 SnapEntry *map = &as->T->snapmap[snap->mapofs];
1018 MSize n, nent = snap->nent;
1019 as->snapfilt1 = as->snapfilt2 = 0;
1020 for (n = 0; n < nent; n++) {
1021 SnapEntry sn = map[n];
1022 IRRef ref = snap_ref(sn);
1023 if (!irref_isk(ref)) {
1024 asm_snap_alloc1(as, ref);
1025 if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM)) {
1026 lj_assertA(irt_type(IR(ref+1)->t) == IRT_SOFTFP,
1027 "snap %d[%d] points to bad SOFTFP IR %04d",
1028 snapno, n, ref - REF_BIAS);
1029 asm_snap_alloc1(as, ref+1);
1030 }
1031 }
1032 }
1033}
1034
1035/* All guards for a snapshot use the same exitno. This is currently the
1036** same as the snapshot number. Since the exact origin of the exit cannot
1037** be determined, all guards for the same snapshot must exit with the same
1038** RegSP mapping.
1039** A renamed ref which has been used in a prior guard for the same snapshot
1040** would cause an inconsistency. The easy way out is to force a spill slot.
1041*/
1042static int asm_snap_checkrename(ASMState *as, IRRef ren)
1043{
1044 if (bloomtest(as->snapfilt1, ren) &&
1045 bloomtest(as->snapfilt2, hashrot(ren, ren + HASH_BIAS))) {
1046 IRIns *ir = IR(ren);
1047 ra_spill(as, ir); /* Register renamed, so force a spill slot. */
1048 RA_DBGX((as, "snaprensp $f $s", ren, ir->s));
1049 return 1; /* Found. */
1050 }
1051 return 0; /* Not found. */
1052}
1053
1054/* Prepare snapshot for next guard or throwing instruction. */
1055static void asm_snap_prep(ASMState *as)
1056{
1057 if (as->snapalloc) {
1058 /* Alloc on first invocation for each snapshot. */
1059 as->snapalloc = 0;
1060 asm_snap_alloc(as, as->snapno);
1061 as->snaprename = as->T->nins;
1062 } else {
1063 /* Check any renames above the highwater mark. */
1064 for (; as->snaprename < as->T->nins; as->snaprename++) {
1065 IRIns *ir = &as->T->ir[as->snaprename];
1066 if (asm_snap_checkrename(as, ir->op1))
1067 ir->op2 = REF_BIAS-1; /* Kill rename. */
1068 }
1069 }
1070}
1071
1072/* Move to previous snapshot when we cross the current snapshot ref. */
1073static void asm_snap_prev(ASMState *as)
1074{
1075 if (as->curins < as->snapref) {
1076 uintptr_t ofs = (uintptr_t)(as->mctoporig - as->mcp);
1077 if (ofs >= 0x10000) lj_trace_err(as->J, LJ_TRERR_MCODEOV);
1078 do {
1079 if (as->snapno == 0) return;
1080 as->snapno--;
1081 as->snapref = as->T->snap[as->snapno].ref;
1082 as->T->snap[as->snapno].mcofs = (uint16_t)ofs; /* Remember mcode ofs. */
1083 } while (as->curins < as->snapref); /* May have no ins inbetween. */
1084 as->snapalloc = 1;
1085 }
1086}
1087
1088/* Fixup snapshot mcode offsetst. */
1089static void asm_snap_fixup_mcofs(ASMState *as)
1090{
1091 uint32_t sz = (uint32_t)(as->mctoporig - as->mcp);
1092 SnapShot *snap = as->T->snap;
1093 SnapNo i;
1094 for (i = as->T->nsnap-1; i > 0; i--) {
1095 /* Compute offset from mcode start and store in correct snapshot. */
1096 snap[i].mcofs = (uint16_t)(sz - snap[i-1].mcofs);
1097 }
1098 snap[0].mcofs = 0;
1099}
1100
1101/* -- Miscellaneous helpers ----------------------------------------------- */
1102
1103/* Calculate stack adjustment. */
1104static int32_t asm_stack_adjust(ASMState *as)
1105{
1106 if (as->evenspill <= SPS_FIXED)
1107 return 0;
1108 return sps_scale(sps_align(as->evenspill));
1109}
1110
1111/* Must match with hash*() in lj_tab.c. */
1112static uint32_t ir_khash(ASMState *as, IRIns *ir)
1113{
1114 uint32_t lo, hi;
1115 UNUSED(as);
1116 if (irt_isstr(ir->t)) {
1117 return ir_kstr(ir)->sid;
1118 } else if (irt_isnum(ir->t)) {
1119 lo = ir_knum(ir)->u32.lo;
1120 hi = ir_knum(ir)->u32.hi << 1;
1121 } else if (irt_ispri(ir->t)) {
1122 lj_assertA(!irt_isnil(ir->t), "hash of nil key");
1123 return irt_type(ir->t)-IRT_FALSE;
1124 } else {
1125 lj_assertA(irt_isgcv(ir->t), "hash of bad IR type %d", irt_type(ir->t));
1126 lo = u32ptr(ir_kgc(ir));
1127#if LJ_GC64
1128 hi = (uint32_t)(u64ptr(ir_kgc(ir)) >> 32) | (irt_toitype(ir->t) << 15);
1129#else
1130 hi = lo + HASH_BIAS;
1131#endif
1132 }
1133 return hashrot(lo, hi);
1134}
1135
1136/* -- Allocations --------------------------------------------------------- */
1137
1138static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args);
1139static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci);
1140
1141static void asm_snew(ASMState *as, IRIns *ir)
1142{
1143 const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_str_new];
1144 IRRef args[3];
1145 asm_snap_prep(as);
1146 args[0] = ASMREF_L; /* lua_State *L */
1147 args[1] = ir->op1; /* const char *str */
1148 args[2] = ir->op2; /* size_t len */
1149 as->gcsteps++;
1150 asm_setupresult(as, ir, ci); /* GCstr * */
1151 asm_gencall(as, ci, args);
1152}
1153
1154static void asm_tnew(ASMState *as, IRIns *ir)
1155{
1156 const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_new1];
1157 IRRef args[2];
1158 asm_snap_prep(as);
1159 args[0] = ASMREF_L; /* lua_State *L */
1160 args[1] = ASMREF_TMP1; /* uint32_t ahsize */
1161 as->gcsteps++;
1162 asm_setupresult(as, ir, ci); /* GCtab * */
1163 asm_gencall(as, ci, args);
1164 ra_allockreg(as, ir->op1 | (ir->op2 << 24), ra_releasetmp(as, ASMREF_TMP1));
1165}
1166
1167static void asm_tdup(ASMState *as, IRIns *ir)
1168{
1169 const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_dup];
1170 IRRef args[2];
1171 asm_snap_prep(as);
1172 args[0] = ASMREF_L; /* lua_State *L */
1173 args[1] = ir->op1; /* const GCtab *kt */
1174 as->gcsteps++;
1175 asm_setupresult(as, ir, ci); /* GCtab * */
1176 asm_gencall(as, ci, args);
1177}
1178
1179static void asm_gc_check(ASMState *as);
1180
1181/* Explicit GC step. */
1182static void asm_gcstep(ASMState *as, IRIns *ir)
1183{
1184 IRIns *ira;
1185 for (ira = IR(as->stopins+1); ira < ir; ira++)
1186 if ((ira->o == IR_TNEW || ira->o == IR_TDUP ||
1187 (LJ_HASFFI && (ira->o == IR_CNEW || ira->o == IR_CNEWI))) &&
1188 ra_used(ira))
1189 as->gcsteps++;
1190 if (as->gcsteps)
1191 asm_gc_check(as);
1192 as->gcsteps = 0x80000000; /* Prevent implicit GC check further up. */
1193}
1194
1195/* -- Buffer operations --------------------------------------------------- */
1196
1197static void asm_tvptr(ASMState *as, Reg dest, IRRef ref, MSize mode);
1198#if LJ_HASBUFFER
1199static void asm_bufhdr_write(ASMState *as, Reg sb);
1200#endif
1201
1202static void asm_bufhdr(ASMState *as, IRIns *ir)
1203{
1204 Reg sb = ra_dest(as, ir, RSET_GPR);
1205 switch (ir->op2) {
1206 case IRBUFHDR_RESET: {
1207 Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, sb));
1208 IRIns irbp;
1209 irbp.ot = IRT(0, IRT_PTR); /* Buffer data pointer type. */
1210 emit_storeofs(as, &irbp, tmp, sb, offsetof(SBuf, w));
1211 emit_loadofs(as, &irbp, tmp, sb, offsetof(SBuf, b));
1212 break;
1213 }
1214 case IRBUFHDR_APPEND: {
1215 /* Rematerialize const buffer pointer instead of likely spill. */
1216 IRIns *irp = IR(ir->op1);
1217 if (!(ra_hasreg(irp->r) || irp == ir-1 ||
1218 (irp == ir-2 && !ra_used(ir-1)))) {
1219 while (!(irp->o == IR_BUFHDR && irp->op2 == IRBUFHDR_RESET))
1220 irp = IR(irp->op1);
1221 if (irref_isk(irp->op1)) {
1222 ra_weak(as, ra_allocref(as, ir->op1, RSET_GPR));
1223 ir = irp;
1224 }
1225 }
1226 break;
1227 }
1228#if LJ_HASBUFFER
1229 case IRBUFHDR_WRITE:
1230 asm_bufhdr_write(as, sb);
1231 break;
1232#endif
1233 default: lj_assertA(0, "bad BUFHDR op2 %d", ir->op2); break;
1234 }
1235#if LJ_TARGET_X86ORX64
1236 ra_left(as, sb, ir->op1);
1237#else
1238 ra_leftov(as, sb, ir->op1);
1239#endif
1240}
1241
1242static void asm_bufput(ASMState *as, IRIns *ir)
1243{
1244 const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_buf_putstr];
1245 IRRef args[3];
1246 IRIns *irs;
1247 int kchar = -129;
1248 args[0] = ir->op1; /* SBuf * */
1249 args[1] = ir->op2; /* GCstr * */
1250 irs = IR(ir->op2);
1251 lj_assertA(irt_isstr(irs->t),
1252 "BUFPUT of non-string IR %04d", ir->op2 - REF_BIAS);
1253 if (irs->o == IR_KGC) {
1254 GCstr *s = ir_kstr(irs);
1255 if (s->len == 1) { /* Optimize put of single-char string constant. */
1256 kchar = (int8_t)strdata(s)[0]; /* Signed! */
1257 args[1] = ASMREF_TMP1; /* int, truncated to char */
1258 ci = &lj_ir_callinfo[IRCALL_lj_buf_putchar];
1259 }
1260 } else if (mayfuse(as, ir->op2) && ra_noreg(irs->r)) {
1261 if (irs->o == IR_TOSTR) { /* Fuse number to string conversions. */
1262 if (irs->op2 == IRTOSTR_NUM) {
1263 args[1] = ASMREF_TMP1; /* TValue * */
1264 ci = &lj_ir_callinfo[IRCALL_lj_strfmt_putnum];
1265 } else {
1266 lj_assertA(irt_isinteger(IR(irs->op1)->t),
1267 "TOSTR of non-numeric IR %04d", irs->op1);
1268 args[1] = irs->op1; /* int */
1269 if (irs->op2 == IRTOSTR_INT)
1270 ci = &lj_ir_callinfo[IRCALL_lj_strfmt_putint];
1271 else
1272 ci = &lj_ir_callinfo[IRCALL_lj_buf_putchar];
1273 }
1274 } else if (irs->o == IR_SNEW) { /* Fuse string allocation. */
1275 args[1] = irs->op1; /* const void * */
1276 args[2] = irs->op2; /* MSize */
1277 ci = &lj_ir_callinfo[IRCALL_lj_buf_putmem];
1278 }
1279 }
1280 asm_setupresult(as, ir, ci); /* SBuf * */
1281 asm_gencall(as, ci, args);
1282 if (args[1] == ASMREF_TMP1) {
1283 Reg tmp = ra_releasetmp(as, ASMREF_TMP1);
1284 if (kchar == -129)
1285 asm_tvptr(as, tmp, irs->op1, IRTMPREF_IN1);
1286 else
1287 ra_allockreg(as, kchar, tmp);
1288 }
1289}
1290
1291static void asm_bufstr(ASMState *as, IRIns *ir)
1292{
1293 const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_buf_tostr];
1294 IRRef args[1];
1295 args[0] = ir->op1; /* SBuf *sb */
1296 as->gcsteps++;
1297 asm_setupresult(as, ir, ci); /* GCstr * */
1298 asm_gencall(as, ci, args);
1299}
1300
1301/* -- Type conversions ---------------------------------------------------- */
1302
1303static void asm_tostr(ASMState *as, IRIns *ir)
1304{
1305 const CCallInfo *ci;
1306 IRRef args[2];
1307 asm_snap_prep(as);
1308 args[0] = ASMREF_L;
1309 as->gcsteps++;
1310 if (ir->op2 == IRTOSTR_NUM) {
1311 args[1] = ASMREF_TMP1; /* cTValue * */
1312 ci = &lj_ir_callinfo[IRCALL_lj_strfmt_num];
1313 } else {
1314 args[1] = ir->op1; /* int32_t k */
1315 if (ir->op2 == IRTOSTR_INT)
1316 ci = &lj_ir_callinfo[IRCALL_lj_strfmt_int];
1317 else
1318 ci = &lj_ir_callinfo[IRCALL_lj_strfmt_char];
1319 }
1320 asm_setupresult(as, ir, ci); /* GCstr * */
1321 asm_gencall(as, ci, args);
1322 if (ir->op2 == IRTOSTR_NUM)
1323 asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op1, IRTMPREF_IN1);
1324}
1325
1326#if LJ_32 && LJ_HASFFI && !LJ_SOFTFP && !LJ_TARGET_X86
1327static void asm_conv64(ASMState *as, IRIns *ir)
1328{
1329 IRType st = (IRType)((ir-1)->op2 & IRCONV_SRCMASK);
1330 IRType dt = (((ir-1)->op2 & IRCONV_DSTMASK) >> IRCONV_DSH);
1331 IRCallID id;
1332 const CCallInfo *ci;
1333#if LJ_TARGET_ARM && !LJ_ABI_SOFTFP
1334 CCallInfo cim;
1335#endif
1336 IRRef args[2];
1337 lj_assertA((ir-1)->o == IR_CONV && ir->o == IR_HIOP,
1338 "not a CONV/HIOP pair at IR %04d", (int)(ir - as->ir) - REF_BIAS);
1339 args[LJ_BE] = (ir-1)->op1;
1340 args[LJ_LE] = ir->op1;
1341 lj_assertA(st != IRT_FLOAT, "bad CONV *64.float emitted");
1342 if (st == IRT_NUM) {
1343 id = IRCALL_lj_vm_num2u64;
1344 ir--;
1345 ci = &lj_ir_callinfo[id];
1346 } else {
1347 id = IRCALL_fp64_l2d + ((dt == IRT_FLOAT) ? 2 : 0) + (st - IRT_I64);
1348#if LJ_TARGET_ARM && !LJ_ABI_SOFTFP
1349 cim = lj_ir_callinfo[id];
1350 cim.flags |= CCI_VARARG; /* These calls don't use the hard-float ABI! */
1351 ci = &cim;
1352#else
1353 ci = &lj_ir_callinfo[id];
1354#endif
1355 }
1356 asm_setupresult(as, ir, ci);
1357 asm_gencall(as, ci, args);
1358}
1359#endif
1360
1361/* -- Memory references --------------------------------------------------- */
1362
1363static void asm_newref(ASMState *as, IRIns *ir)
1364{
1365 const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_tab_newkey];
1366 IRRef args[3];
1367 if (ir->r == RID_SINK)
1368 return;
1369 asm_snap_prep(as);
1370 args[0] = ASMREF_L; /* lua_State *L */
1371 args[1] = ir->op1; /* GCtab *t */
1372 args[2] = ASMREF_TMP1; /* cTValue *key */
1373 asm_setupresult(as, ir, ci); /* TValue * */
1374 asm_gencall(as, ci, args);
1375 asm_tvptr(as, ra_releasetmp(as, ASMREF_TMP1), ir->op2, IRTMPREF_IN1);
1376}
1377
1378static void asm_tmpref(ASMState *as, IRIns *ir)
1379{
1380 Reg r = ra_dest(as, ir, RSET_GPR);
1381 asm_tvptr(as, r, ir->op1, ir->op2);
1382}
1383
1384static void asm_lref(ASMState *as, IRIns *ir)
1385{
1386 Reg r = ra_dest(as, ir, RSET_GPR);
1387#if LJ_TARGET_X86ORX64
1388 ra_left(as, r, ASMREF_L);
1389#else
1390 ra_leftov(as, r, ASMREF_L);
1391#endif
1392}
1393
1394/* -- Calls --------------------------------------------------------------- */
1395
1396/* Collect arguments from CALL* and CARG instructions. */
1397static void asm_collectargs(ASMState *as, IRIns *ir,
1398 const CCallInfo *ci, IRRef *args)
1399{
1400 uint32_t n = CCI_XNARGS(ci);
1401 /* Account for split args. */
1402 lj_assertA(n <= CCI_NARGS_MAX*2, "too many args %d to collect", n);
1403 if ((ci->flags & CCI_L)) { *args++ = ASMREF_L; n--; }
1404 while (n-- > 1) {
1405 ir = IR(ir->op1);
1406 lj_assertA(ir->o == IR_CARG, "malformed CALL arg tree");
1407 args[n] = ir->op2 == REF_NIL ? 0 : ir->op2;
1408 }
1409 args[0] = ir->op1 == REF_NIL ? 0 : ir->op1;
1410 lj_assertA(IR(ir->op1)->o != IR_CARG, "malformed CALL arg tree");
1411}
1412
1413/* Reconstruct CCallInfo flags for CALLX*. */
1414static uint32_t asm_callx_flags(ASMState *as, IRIns *ir)
1415{
1416 uint32_t nargs = 0;
1417 if (ir->op1 != REF_NIL) { /* Count number of arguments first. */
1418 IRIns *ira = IR(ir->op1);
1419 nargs++;
1420 while (ira->o == IR_CARG) { nargs++; ira = IR(ira->op1); }
1421 }
1422#if LJ_HASFFI
1423 if (IR(ir->op2)->o == IR_CARG) { /* Copy calling convention info. */
1424 CTypeID id = (CTypeID)IR(IR(ir->op2)->op2)->i;
1425 CType *ct = ctype_get(ctype_ctsG(J2G(as->J)), id);
1426 nargs |= ((ct->info & CTF_VARARG) ? CCI_VARARG : 0);
1427#if LJ_TARGET_X86
1428 nargs |= (ctype_cconv(ct->info) << CCI_CC_SHIFT);
1429#endif
1430 }
1431#endif
1432 return (nargs | (ir->t.irt << CCI_OTSHIFT));
1433}
1434
1435static void asm_callid(ASMState *as, IRIns *ir, IRCallID id)
1436{
1437 const CCallInfo *ci = &lj_ir_callinfo[id];
1438 IRRef args[2];
1439 args[0] = ir->op1;
1440 args[1] = ir->op2;
1441 asm_setupresult(as, ir, ci);
1442 asm_gencall(as, ci, args);
1443}
1444
1445static void asm_call(ASMState *as, IRIns *ir)
1446{
1447 IRRef args[CCI_NARGS_MAX];
1448 const CCallInfo *ci = &lj_ir_callinfo[ir->op2];
1449 asm_collectargs(as, ir, ci, args);
1450 asm_setupresult(as, ir, ci);
1451 asm_gencall(as, ci, args);
1452}
1453
1454/* -- PHI and loop handling ----------------------------------------------- */
1455
1456/* Break a PHI cycle by renaming to a free register (evict if needed). */
1457static void asm_phi_break(ASMState *as, RegSet blocked, RegSet blockedby,
1458 RegSet allow)
1459{
1460 RegSet candidates = blocked & allow;
1461 if (candidates) { /* If this register file has candidates. */
1462 /* Note: the set for ra_pick cannot be empty, since each register file
1463 ** has some registers never allocated to PHIs.
1464 */
1465 Reg down, up = ra_pick(as, ~blocked & allow); /* Get a free register. */
1466 if (candidates & ~blockedby) /* Optimize shifts, else it's a cycle. */
1467 candidates = candidates & ~blockedby;
1468 down = rset_picktop(candidates); /* Pick candidate PHI register. */
1469 ra_rename(as, down, up); /* And rename it to the free register. */
1470 }
1471}
1472
1473/* PHI register shuffling.
1474**
1475** The allocator tries hard to preserve PHI register assignments across
1476** the loop body. Most of the time this loop does nothing, since there
1477** are no register mismatches.
1478**
1479** If a register mismatch is detected and ...
1480** - the register is currently free: rename it.
1481** - the register is blocked by an invariant: restore/remat and rename it.
1482** - Otherwise the register is used by another PHI, so mark it as blocked.
1483**
1484** The renames are order-sensitive, so just retry the loop if a register
1485** is marked as blocked, but has been freed in the meantime. A cycle is
1486** detected if all of the blocked registers are allocated. To break the
1487** cycle rename one of them to a free register and retry.
1488**
1489** Note that PHI spill slots are kept in sync and don't need to be shuffled.
1490*/
1491static void asm_phi_shuffle(ASMState *as)
1492{
1493 RegSet work;
1494
1495 /* Find and resolve PHI register mismatches. */
1496 for (;;) {
1497 RegSet blocked = RSET_EMPTY;
1498 RegSet blockedby = RSET_EMPTY;
1499 RegSet phiset = as->phiset;
1500 while (phiset) { /* Check all left PHI operand registers. */
1501 Reg r = rset_pickbot(phiset);
1502 IRIns *irl = IR(as->phireg[r]);
1503 Reg left = irl->r;
1504 if (r != left) { /* Mismatch? */
1505 if (!rset_test(as->freeset, r)) { /* PHI register blocked? */
1506 IRRef ref = regcost_ref(as->cost[r]);
1507 /* Blocked by other PHI (w/reg)? */
1508 if (!ra_iskref(ref) && irt_ismarked(IR(ref)->t)) {
1509 rset_set(blocked, r);
1510 if (ra_hasreg(left))
1511 rset_set(blockedby, left);
1512 left = RID_NONE;
1513 } else { /* Otherwise grab register from invariant. */
1514 ra_restore(as, ref);
1515 checkmclim(as);
1516 }
1517 }
1518 if (ra_hasreg(left)) {
1519 ra_rename(as, left, r);
1520 checkmclim(as);
1521 }
1522 }
1523 rset_clear(phiset, r);
1524 }
1525 if (!blocked) break; /* Finished. */
1526 if (!(as->freeset & blocked)) { /* Break cycles if none are free. */
1527 asm_phi_break(as, blocked, blockedby, RSET_GPR);
1528 if (!LJ_SOFTFP) asm_phi_break(as, blocked, blockedby, RSET_FPR);
1529 checkmclim(as);
1530 } /* Else retry some more renames. */
1531 }
1532
1533 /* Restore/remat invariants whose registers are modified inside the loop. */
1534#if !LJ_SOFTFP
1535 work = as->modset & ~(as->freeset | as->phiset) & RSET_FPR;
1536 while (work) {
1537 Reg r = rset_pickbot(work);
1538 ra_restore(as, regcost_ref(as->cost[r]));
1539 rset_clear(work, r);
1540 checkmclim(as);
1541 }
1542#endif
1543 work = as->modset & ~(as->freeset | as->phiset);
1544 while (work) {
1545 Reg r = rset_pickbot(work);
1546 ra_restore(as, regcost_ref(as->cost[r]));
1547 rset_clear(work, r);
1548 checkmclim(as);
1549 }
1550
1551 /* Allocate and save all unsaved PHI regs and clear marks. */
1552 work = as->phiset;
1553 while (work) {
1554 Reg r = rset_picktop(work);
1555 IRRef lref = as->phireg[r];
1556 IRIns *ir = IR(lref);
1557 if (ra_hasspill(ir->s)) { /* Left PHI gained a spill slot? */
1558 irt_clearmark(ir->t); /* Handled here, so clear marker now. */
1559 ra_alloc1(as, lref, RID2RSET(r));
1560 ra_save(as, ir, r); /* Save to spill slot inside the loop. */
1561 checkmclim(as);
1562 }
1563 rset_clear(work, r);
1564 }
1565}
1566
1567/* Copy unsynced left/right PHI spill slots. Rarely needed. */
1568static void asm_phi_copyspill(ASMState *as)
1569{
1570 int need = 0;
1571 IRIns *ir;
1572 for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--)
1573 if (ra_hasspill(ir->s) && ra_hasspill(IR(ir->op1)->s))
1574 need |= irt_isfp(ir->t) ? 2 : 1; /* Unsynced spill slot? */
1575 if ((need & 1)) { /* Copy integer spill slots. */
1576#if !LJ_TARGET_X86ORX64
1577 Reg r = RID_TMP;
1578#else
1579 Reg r = RID_RET;
1580 if ((as->freeset & RSET_GPR))
1581 r = rset_pickbot((as->freeset & RSET_GPR));
1582 else
1583 emit_spload(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);
1584#endif
1585 for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--) {
1586 if (ra_hasspill(ir->s)) {
1587 IRIns *irl = IR(ir->op1);
1588 if (ra_hasspill(irl->s) && !irt_isfp(ir->t)) {
1589 emit_spstore(as, irl, r, sps_scale(irl->s));
1590 emit_spload(as, ir, r, sps_scale(ir->s));
1591 checkmclim(as);
1592 }
1593 }
1594 }
1595#if LJ_TARGET_X86ORX64
1596 if (!rset_test(as->freeset, r))
1597 emit_spstore(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);
1598#endif
1599 }
1600#if !LJ_SOFTFP
1601 if ((need & 2)) { /* Copy FP spill slots. */
1602#if LJ_TARGET_X86
1603 Reg r = RID_XMM0;
1604#else
1605 Reg r = RID_FPRET;
1606#endif
1607 if ((as->freeset & RSET_FPR))
1608 r = rset_pickbot((as->freeset & RSET_FPR));
1609 if (!rset_test(as->freeset, r))
1610 emit_spload(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);
1611 for (ir = IR(as->orignins-1); ir->o == IR_PHI; ir--) {
1612 if (ra_hasspill(ir->s)) {
1613 IRIns *irl = IR(ir->op1);
1614 if (ra_hasspill(irl->s) && irt_isfp(ir->t)) {
1615 emit_spstore(as, irl, r, sps_scale(irl->s));
1616 emit_spload(as, ir, r, sps_scale(ir->s));
1617 checkmclim(as);
1618 }
1619 }
1620 }
1621 if (!rset_test(as->freeset, r))
1622 emit_spstore(as, IR(regcost_ref(as->cost[r])), r, SPOFS_TMP);
1623 }
1624#endif
1625}
1626
1627/* Emit renames for left PHIs which are only spilled outside the loop. */
1628static void asm_phi_fixup(ASMState *as)
1629{
1630 RegSet work = as->phiset;
1631 while (work) {
1632 Reg r = rset_picktop(work);
1633 IRRef lref = as->phireg[r];
1634 IRIns *ir = IR(lref);
1635 if (irt_ismarked(ir->t)) {
1636 irt_clearmark(ir->t);
1637 /* Left PHI gained a spill slot before the loop? */
1638 if (ra_hasspill(ir->s)) {
1639 ra_addrename(as, r, lref, as->loopsnapno);
1640 }
1641 }
1642 rset_clear(work, r);
1643 }
1644}
1645
1646/* Setup right PHI reference. */
1647static void asm_phi(ASMState *as, IRIns *ir)
1648{
1649 RegSet allow = ((!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR) &
1650 ~as->phiset;
1651 RegSet afree = (as->freeset & allow);
1652 IRIns *irl = IR(ir->op1);
1653 IRIns *irr = IR(ir->op2);
1654 if (ir->r == RID_SINK) /* Sink PHI. */
1655 return;
1656 /* Spill slot shuffling is not implemented yet (but rarely needed). */
1657 if (ra_hasspill(irl->s) || ra_hasspill(irr->s))
1658 lj_trace_err(as->J, LJ_TRERR_NYIPHI);
1659 /* Leave at least one register free for non-PHIs (and PHI cycle breaking). */
1660 if ((afree & (afree-1))) { /* Two or more free registers? */
1661 Reg r;
1662 if (ra_noreg(irr->r)) { /* Get a register for the right PHI. */
1663 r = ra_allocref(as, ir->op2, allow);
1664 } else { /* Duplicate right PHI, need a copy (rare). */
1665 r = ra_scratch(as, allow);
1666 emit_movrr(as, irr, r, irr->r);
1667 }
1668 ir->r = (uint8_t)r;
1669 rset_set(as->phiset, r);
1670 as->phireg[r] = (IRRef1)ir->op1;
1671 irt_setmark(irl->t); /* Marks left PHIs _with_ register. */
1672 if (ra_noreg(irl->r))
1673 ra_sethint(irl->r, r); /* Set register hint for left PHI. */
1674 } else { /* Otherwise allocate a spill slot. */
1675 /* This is overly restrictive, but it triggers only on synthetic code. */
1676 if (ra_hasreg(irl->r) || ra_hasreg(irr->r))
1677 lj_trace_err(as->J, LJ_TRERR_NYIPHI);
1678 ra_spill(as, ir);
1679 irr->s = ir->s; /* Set right PHI spill slot. Sync left slot later. */
1680 }
1681}
1682
1683static void asm_loop_fixup(ASMState *as);
1684
1685/* Middle part of a loop. */
1686static void asm_loop(ASMState *as)
1687{
1688 MCode *mcspill;
1689 /* LOOP is a guard, so the snapno is up to date. */
1690 as->loopsnapno = as->snapno;
1691 if (as->gcsteps)
1692 asm_gc_check(as);
1693 /* LOOP marks the transition from the variant to the invariant part. */
1694 as->flagmcp = as->invmcp = NULL;
1695 as->sectref = 0;
1696 if (!neverfuse(as)) as->fuseref = 0;
1697 asm_phi_shuffle(as);
1698 mcspill = as->mcp;
1699 asm_phi_copyspill(as);
1700 asm_loop_fixup(as);
1701 as->mcloop = as->mcp;
1702 RA_DBGX((as, "===== LOOP ====="));
1703 if (!as->realign) RA_DBG_FLUSH();
1704 if (as->mcp != mcspill)
1705 emit_jmp(as, mcspill);
1706}
1707
1708/* -- Target-specific assembler ------------------------------------------- */
1709
1710#if LJ_TARGET_X86ORX64
1711#include "lj_asm_x86.h"
1712#elif LJ_TARGET_ARM
1713#include "lj_asm_arm.h"
1714#elif LJ_TARGET_ARM64
1715#include "lj_asm_arm64.h"
1716#elif LJ_TARGET_PPC
1717#include "lj_asm_ppc.h"
1718#elif LJ_TARGET_MIPS
1719#include "lj_asm_mips.h"
1720#else
1721#error "Missing assembler for target CPU"
1722#endif
1723
1724/* -- Common instruction helpers ------------------------------------------ */
1725
1726#if !LJ_SOFTFP32
1727#if !LJ_TARGET_X86ORX64
1728#define asm_ldexp(as, ir) asm_callid(as, ir, IRCALL_ldexp)
1729#endif
1730
1731static void asm_pow(ASMState *as, IRIns *ir)
1732{
1733#if LJ_64 && LJ_HASFFI
1734 if (!irt_isnum(ir->t))
1735 asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_powi64 :
1736 IRCALL_lj_carith_powu64);
1737 else
1738#endif
1739 asm_callid(as, ir, IRCALL_pow);
1740}
1741
1742static void asm_div(ASMState *as, IRIns *ir)
1743{
1744#if LJ_64 && LJ_HASFFI
1745 if (!irt_isnum(ir->t))
1746 asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_divi64 :
1747 IRCALL_lj_carith_divu64);
1748 else
1749#endif
1750 asm_fpdiv(as, ir);
1751}
1752#endif
1753
1754static void asm_mod(ASMState *as, IRIns *ir)
1755{
1756#if LJ_64 && LJ_HASFFI
1757 if (!irt_isint(ir->t))
1758 asm_callid(as, ir, irt_isi64(ir->t) ? IRCALL_lj_carith_modi64 :
1759 IRCALL_lj_carith_modu64);
1760 else
1761#endif
1762 asm_callid(as, ir, IRCALL_lj_vm_modi);
1763}
1764
1765static void asm_fuseequal(ASMState *as, IRIns *ir)
1766{
1767 /* Fuse HREF + EQ/NE. */
1768 if ((ir-1)->o == IR_HREF && ir->op1 == as->curins-1) {
1769 as->curins--;
1770 asm_href(as, ir-1, (IROp)ir->o);
1771 } else {
1772 asm_equal(as, ir);
1773 }
1774}
1775
1776static void asm_alen(ASMState *as, IRIns *ir)
1777{
1778 asm_callid(as, ir, ir->op2 == REF_NIL ? IRCALL_lj_tab_len :
1779 IRCALL_lj_tab_len_hint);
1780}
1781
1782/* -- Instruction dispatch ------------------------------------------------ */
1783
1784/* Assemble a single instruction. */
1785static void asm_ir(ASMState *as, IRIns *ir)
1786{
1787 switch ((IROp)ir->o) {
1788 /* Miscellaneous ops. */
1789 case IR_LOOP: asm_loop(as); break;
1790 case IR_NOP: case IR_XBAR:
1791 lj_assertA(!ra_used(ir),
1792 "IR %04d not unused", (int)(ir - as->ir) - REF_BIAS);
1793 break;
1794 case IR_USE:
1795 ra_alloc1(as, ir->op1, irt_isfp(ir->t) ? RSET_FPR : RSET_GPR); break;
1796 case IR_PHI: asm_phi(as, ir); break;
1797 case IR_HIOP: asm_hiop(as, ir); break;
1798 case IR_GCSTEP: asm_gcstep(as, ir); break;
1799 case IR_PROF: asm_prof(as, ir); break;
1800
1801 /* Guarded assertions. */
1802 case IR_LT: case IR_GE: case IR_LE: case IR_GT:
1803 case IR_ULT: case IR_UGE: case IR_ULE: case IR_UGT:
1804 case IR_ABC:
1805 asm_comp(as, ir);
1806 break;
1807 case IR_EQ: case IR_NE: asm_fuseequal(as, ir); break;
1808
1809 case IR_RETF: asm_retf(as, ir); break;
1810
1811 /* Bit ops. */
1812 case IR_BNOT: asm_bnot(as, ir); break;
1813 case IR_BSWAP: asm_bswap(as, ir); break;
1814 case IR_BAND: asm_band(as, ir); break;
1815 case IR_BOR: asm_bor(as, ir); break;
1816 case IR_BXOR: asm_bxor(as, ir); break;
1817 case IR_BSHL: asm_bshl(as, ir); break;
1818 case IR_BSHR: asm_bshr(as, ir); break;
1819 case IR_BSAR: asm_bsar(as, ir); break;
1820 case IR_BROL: asm_brol(as, ir); break;
1821 case IR_BROR: asm_bror(as, ir); break;
1822
1823 /* Arithmetic ops. */
1824 case IR_ADD: asm_add(as, ir); break;
1825 case IR_SUB: asm_sub(as, ir); break;
1826 case IR_MUL: asm_mul(as, ir); break;
1827 case IR_MOD: asm_mod(as, ir); break;
1828 case IR_NEG: asm_neg(as, ir); break;
1829#if LJ_SOFTFP32
1830 case IR_DIV: case IR_POW: case IR_ABS:
1831 case IR_LDEXP: case IR_FPMATH: case IR_TOBIT:
1832 /* Unused for LJ_SOFTFP32. */
1833 lj_assertA(0, "IR %04d with unused op %d",
1834 (int)(ir - as->ir) - REF_BIAS, ir->o);
1835 break;
1836#else
1837 case IR_DIV: asm_div(as, ir); break;
1838 case IR_POW: asm_pow(as, ir); break;
1839 case IR_ABS: asm_abs(as, ir); break;
1840 case IR_LDEXP: asm_ldexp(as, ir); break;
1841 case IR_FPMATH: asm_fpmath(as, ir); break;
1842 case IR_TOBIT: asm_tobit(as, ir); break;
1843#endif
1844 case IR_MIN: asm_min(as, ir); break;
1845 case IR_MAX: asm_max(as, ir); break;
1846
1847 /* Overflow-checking arithmetic ops. */
1848 case IR_ADDOV: asm_addov(as, ir); break;
1849 case IR_SUBOV: asm_subov(as, ir); break;
1850 case IR_MULOV: asm_mulov(as, ir); break;
1851
1852 /* Memory references. */
1853 case IR_AREF: asm_aref(as, ir); break;
1854 case IR_HREF: asm_href(as, ir, 0); break;
1855 case IR_HREFK: asm_hrefk(as, ir); break;
1856 case IR_NEWREF: asm_newref(as, ir); break;
1857 case IR_UREFO: case IR_UREFC: asm_uref(as, ir); break;
1858 case IR_FREF: asm_fref(as, ir); break;
1859 case IR_TMPREF: asm_tmpref(as, ir); break;
1860 case IR_STRREF: asm_strref(as, ir); break;
1861 case IR_LREF: asm_lref(as, ir); break;
1862
1863 /* Loads and stores. */
1864 case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:
1865 asm_ahuvload(as, ir);
1866 break;
1867 case IR_FLOAD: asm_fload(as, ir); break;
1868 case IR_XLOAD: asm_xload(as, ir); break;
1869 case IR_SLOAD: asm_sload(as, ir); break;
1870 case IR_ALEN: asm_alen(as, ir); break;
1871
1872 case IR_ASTORE: case IR_HSTORE: case IR_USTORE: asm_ahustore(as, ir); break;
1873 case IR_FSTORE: asm_fstore(as, ir); break;
1874 case IR_XSTORE: asm_xstore(as, ir); break;
1875
1876 /* Allocations. */
1877 case IR_SNEW: case IR_XSNEW: asm_snew(as, ir); break;
1878 case IR_TNEW: asm_tnew(as, ir); break;
1879 case IR_TDUP: asm_tdup(as, ir); break;
1880 case IR_CNEW: case IR_CNEWI:
1881#if LJ_HASFFI
1882 asm_cnew(as, ir);
1883#else
1884 lj_assertA(0, "IR %04d with unused op %d",
1885 (int)(ir - as->ir) - REF_BIAS, ir->o);
1886#endif
1887 break;
1888
1889 /* Buffer operations. */
1890 case IR_BUFHDR: asm_bufhdr(as, ir); break;
1891 case IR_BUFPUT: asm_bufput(as, ir); break;
1892 case IR_BUFSTR: asm_bufstr(as, ir); break;
1893
1894 /* Write barriers. */
1895 case IR_TBAR: asm_tbar(as, ir); break;
1896 case IR_OBAR: asm_obar(as, ir); break;
1897
1898 /* Type conversions. */
1899 case IR_CONV: asm_conv(as, ir); break;
1900 case IR_TOSTR: asm_tostr(as, ir); break;
1901 case IR_STRTO: asm_strto(as, ir); break;
1902
1903 /* Calls. */
1904 case IR_CALLA:
1905 as->gcsteps++;
1906 /* fallthrough */
1907 case IR_CALLN: case IR_CALLL: case IR_CALLS: asm_call(as, ir); break;
1908 case IR_CALLXS: asm_callx(as, ir); break;
1909 case IR_CARG: break;
1910
1911 default:
1912 setintV(&as->J->errinfo, ir->o);
1913 lj_trace_err_info(as->J, LJ_TRERR_NYIIR);
1914 break;
1915 }
1916}
1917
1918/* -- Head of trace ------------------------------------------------------- */
1919
1920/* Head of a root trace. */
1921static void asm_head_root(ASMState *as)
1922{
1923 int32_t spadj;
1924 asm_head_root_base(as);
1925 emit_setvmstate(as, (int32_t)as->T->traceno);
1926 spadj = asm_stack_adjust(as);
1927 as->T->spadjust = (uint16_t)spadj;
1928 emit_spsub(as, spadj);
1929 /* Root traces assume a checked stack for the starting proto. */
1930 as->T->topslot = gcref(as->T->startpt)->pt.framesize;
1931}
1932
1933/* Head of a side trace.
1934**
1935** The current simplistic algorithm requires that all slots inherited
1936** from the parent are live in a register between pass 2 and pass 3. This
1937** avoids the complexity of stack slot shuffling. But of course this may
1938** overflow the register set in some cases and cause the dreaded error:
1939** "NYI: register coalescing too complex". A refined algorithm is needed.
1940*/
1941static void asm_head_side(ASMState *as)
1942{
1943 IRRef1 sloadins[RID_MAX];
1944 RegSet allow = RSET_ALL; /* Inverse of all coalesced registers. */
1945 RegSet live = RSET_EMPTY; /* Live parent registers. */
1946 RegSet pallow = RSET_GPR; /* Registers needed by the parent stack check. */
1947 Reg pbase;
1948 IRIns *irp = &as->parent->ir[REF_BASE]; /* Parent base. */
1949 int32_t spadj, spdelta;
1950 int pass2 = 0;
1951 int pass3 = 0;
1952 IRRef i;
1953
1954 if (as->snapno && as->topslot > as->parent->topslot) {
1955 /* Force snap #0 alloc to prevent register overwrite in stack check. */
1956 asm_snap_alloc(as, 0);
1957 }
1958 pbase = asm_head_side_base(as, irp);
1959 if (pbase != RID_NONE) {
1960 rset_clear(allow, pbase);
1961 rset_clear(pallow, pbase);
1962 }
1963
1964 /* Scan all parent SLOADs and collect register dependencies. */
1965 for (i = as->stopins; i > REF_BASE; i--) {
1966 IRIns *ir = IR(i);
1967 RegSP rs;
1968 lj_assertA((ir->o == IR_SLOAD && (ir->op2 & IRSLOAD_PARENT)) ||
1969 (LJ_SOFTFP && ir->o == IR_HIOP) || ir->o == IR_PVAL,
1970 "IR %04d has bad parent op %d",
1971 (int)(ir - as->ir) - REF_BIAS, ir->o);
1972 rs = as->parentmap[i - REF_FIRST];
1973 if (ra_hasreg(ir->r)) {
1974 rset_clear(allow, ir->r);
1975 if (ra_hasspill(ir->s)) {
1976 ra_save(as, ir, ir->r);
1977 checkmclim(as);
1978 }
1979 } else if (ra_hasspill(ir->s)) {
1980 irt_setmark(ir->t);
1981 pass2 = 1;
1982 }
1983 if (ir->r == rs) { /* Coalesce matching registers right now. */
1984 ra_free(as, ir->r);
1985 } else if (ra_hasspill(regsp_spill(rs))) {
1986 if (ra_hasreg(ir->r))
1987 pass3 = 1;
1988 } else if (ra_used(ir)) {
1989 sloadins[rs] = (IRRef1)i;
1990 rset_set(live, rs); /* Block live parent register. */
1991 }
1992 if (!ra_hasspill(regsp_spill(rs))) rset_clear(pallow, regsp_reg(rs));
1993 }
1994
1995 /* Calculate stack frame adjustment. */
1996 spadj = asm_stack_adjust(as);
1997 spdelta = spadj - (int32_t)as->parent->spadjust;
1998 if (spdelta < 0) { /* Don't shrink the stack frame. */
1999 spadj = (int32_t)as->parent->spadjust;
2000 spdelta = 0;
2001 }
2002 as->T->spadjust = (uint16_t)spadj;
2003
2004 /* Reload spilled target registers. */
2005 if (pass2) {
2006 for (i = as->stopins; i > REF_BASE; i--) {
2007 IRIns *ir = IR(i);
2008 if (irt_ismarked(ir->t)) {
2009 RegSet mask;
2010 Reg r;
2011 RegSP rs;
2012 irt_clearmark(ir->t);
2013 rs = as->parentmap[i - REF_FIRST];
2014 if (!ra_hasspill(regsp_spill(rs)))
2015 ra_sethint(ir->r, rs); /* Hint may be gone, set it again. */
2016 else if (sps_scale(regsp_spill(rs))+spdelta == sps_scale(ir->s))
2017 continue; /* Same spill slot, do nothing. */
2018 mask = ((!LJ_SOFTFP && irt_isfp(ir->t)) ? RSET_FPR : RSET_GPR) & allow;
2019 if (mask == RSET_EMPTY)
2020 lj_trace_err(as->J, LJ_TRERR_NYICOAL);
2021 r = ra_allocref(as, i, mask);
2022 ra_save(as, ir, r);
2023 rset_clear(allow, r);
2024 if (r == rs) { /* Coalesce matching registers right now. */
2025 ra_free(as, r);
2026 rset_clear(live, r);
2027 } else if (ra_hasspill(regsp_spill(rs))) {
2028 pass3 = 1;
2029 }
2030 checkmclim(as);
2031 }
2032 }
2033 }
2034
2035 /* Store trace number and adjust stack frame relative to the parent. */
2036 emit_setvmstate(as, (int32_t)as->T->traceno);
2037 emit_spsub(as, spdelta);
2038
2039#if !LJ_TARGET_X86ORX64
2040 /* Restore BASE register from parent spill slot. */
2041 if (ra_hasspill(irp->s))
2042 emit_spload(as, IR(REF_BASE), IR(REF_BASE)->r, sps_scale(irp->s));
2043#endif
2044
2045 /* Restore target registers from parent spill slots. */
2046 if (pass3) {
2047 RegSet work = ~as->freeset & RSET_ALL;
2048 while (work) {
2049 Reg r = rset_pickbot(work);
2050 IRRef ref = regcost_ref(as->cost[r]);
2051 RegSP rs = as->parentmap[ref - REF_FIRST];
2052 rset_clear(work, r);
2053 if (ra_hasspill(regsp_spill(rs))) {
2054 int32_t ofs = sps_scale(regsp_spill(rs));
2055 ra_free(as, r);
2056 emit_spload(as, IR(ref), r, ofs);
2057 checkmclim(as);
2058 }
2059 }
2060 }
2061
2062 /* Shuffle registers to match up target regs with parent regs. */
2063 for (;;) {
2064 RegSet work;
2065
2066 /* Repeatedly coalesce free live registers by moving to their target. */
2067 while ((work = as->freeset & live) != RSET_EMPTY) {
2068 Reg rp = rset_pickbot(work);
2069 IRIns *ir = IR(sloadins[rp]);
2070 rset_clear(live, rp);
2071 rset_clear(allow, rp);
2072 ra_free(as, ir->r);
2073 emit_movrr(as, ir, ir->r, rp);
2074 checkmclim(as);
2075 }
2076
2077 /* We're done if no live registers remain. */
2078 if (live == RSET_EMPTY)
2079 break;
2080
2081 /* Break cycles by renaming one target to a temp. register. */
2082 if (live & RSET_GPR) {
2083 RegSet tmpset = as->freeset & ~live & allow & RSET_GPR;
2084 if (tmpset == RSET_EMPTY)
2085 lj_trace_err(as->J, LJ_TRERR_NYICOAL);
2086 ra_rename(as, rset_pickbot(live & RSET_GPR), rset_pickbot(tmpset));
2087 }
2088 if (!LJ_SOFTFP && (live & RSET_FPR)) {
2089 RegSet tmpset = as->freeset & ~live & allow & RSET_FPR;
2090 if (tmpset == RSET_EMPTY)
2091 lj_trace_err(as->J, LJ_TRERR_NYICOAL);
2092 ra_rename(as, rset_pickbot(live & RSET_FPR), rset_pickbot(tmpset));
2093 }
2094 checkmclim(as);
2095 /* Continue with coalescing to fix up the broken cycle(s). */
2096 }
2097
2098 /* Inherit top stack slot already checked by parent trace. */
2099 as->T->topslot = as->parent->topslot;
2100 if (as->topslot > as->T->topslot) { /* Need to check for higher slot? */
2101#ifdef EXITSTATE_CHECKEXIT
2102 /* Highest exit + 1 indicates stack check. */
2103 ExitNo exitno = as->T->nsnap;
2104#else
2105 /* Reuse the parent exit in the context of the parent trace. */
2106 ExitNo exitno = as->J->exitno;
2107#endif
2108 as->T->topslot = (uint8_t)as->topslot; /* Remember for child traces. */
2109 asm_stack_check(as, as->topslot, irp, pallow, exitno);
2110 }
2111}
2112
2113/* -- Tail of trace ------------------------------------------------------- */
2114
2115/* Get base slot for a snapshot. */
2116static BCReg asm_baseslot(ASMState *as, SnapShot *snap, int *gotframe)
2117{
2118 SnapEntry *map = &as->T->snapmap[snap->mapofs];
2119 MSize n;
2120 for (n = snap->nent; n > 0; n--) {
2121 SnapEntry sn = map[n-1];
2122 if ((sn & SNAP_FRAME)) {
2123 *gotframe = 1;
2124 return snap_slot(sn) - LJ_FR2;
2125 }
2126 }
2127 return 0;
2128}
2129
2130/* Link to another trace. */
2131static void asm_tail_link(ASMState *as)
2132{
2133 SnapNo snapno = as->T->nsnap-1; /* Last snapshot. */
2134 SnapShot *snap = &as->T->snap[snapno];
2135 int gotframe = 0;
2136 BCReg baseslot = asm_baseslot(as, snap, &gotframe);
2137
2138 as->topslot = snap->topslot;
2139 checkmclim(as);
2140 ra_allocref(as, REF_BASE, RID2RSET(RID_BASE));
2141
2142 if (as->T->link == 0) {
2143 /* Setup fixed registers for exit to interpreter. */
2144 const BCIns *pc = snap_pc(&as->T->snapmap[snap->mapofs + snap->nent]);
2145 int32_t mres;
2146 if (bc_op(*pc) == BC_JLOOP) { /* NYI: find a better way to do this. */
2147 BCIns *retpc = &traceref(as->J, bc_d(*pc))->startins;
2148 if (bc_isret(bc_op(*retpc)))
2149 pc = retpc;
2150 }
2151#if LJ_GC64
2152 emit_loadu64(as, RID_LPC, u64ptr(pc));
2153#else
2154 ra_allockreg(as, i32ptr(J2GG(as->J)->dispatch), RID_DISPATCH);
2155 ra_allockreg(as, i32ptr(pc), RID_LPC);
2156#endif
2157 mres = (int32_t)(snap->nslots - baseslot - LJ_FR2);
2158 switch (bc_op(*pc)) {
2159 case BC_CALLM: case BC_CALLMT:
2160 mres -= (int32_t)(1 + LJ_FR2 + bc_a(*pc) + bc_c(*pc)); break;
2161 case BC_RETM: mres -= (int32_t)(bc_a(*pc) + bc_d(*pc)); break;
2162 case BC_TSETM: mres -= (int32_t)bc_a(*pc); break;
2163 default: if (bc_op(*pc) < BC_FUNCF) mres = 0; break;
2164 }
2165 ra_allockreg(as, mres, RID_RET); /* Return MULTRES or 0. */
2166 } else if (baseslot) {
2167 /* Save modified BASE for linking to trace with higher start frame. */
2168 emit_setgl(as, RID_BASE, jit_base);
2169 }
2170 emit_addptr(as, RID_BASE, 8*(int32_t)baseslot);
2171
2172 if (as->J->ktrace) { /* Patch ktrace slot with the final GCtrace pointer. */
2173 setgcref(IR(as->J->ktrace)[LJ_GC64].gcr, obj2gco(as->J->curfinal));
2174 IR(as->J->ktrace)->o = IR_KGC;
2175 }
2176
2177 /* Sync the interpreter state with the on-trace state. */
2178 asm_stack_restore(as, snap);
2179
2180 /* Root traces that add frames need to check the stack at the end. */
2181 if (!as->parent && gotframe)
2182 asm_stack_check(as, as->topslot, NULL, as->freeset & RSET_GPR, snapno);
2183}
2184
2185/* -- Trace setup --------------------------------------------------------- */
2186
2187/* Clear reg/sp for all instructions and add register hints. */
2188static void asm_setup_regsp(ASMState *as)
2189{
2190 GCtrace *T = as->T;
2191 int sink = T->sinktags;
2192 IRRef nins = T->nins;
2193 IRIns *ir, *lastir;
2194 int inloop;
2195#if LJ_TARGET_ARM
2196 uint32_t rload = 0xa6402a64;
2197#endif
2198
2199 ra_setup(as);
2200#if LJ_TARGET_ARM64
2201 ra_setkref(as, RID_GL, (intptr_t)J2G(as->J));
2202#endif
2203
2204 /* Clear reg/sp for constants. */
2205 for (ir = IR(T->nk), lastir = IR(REF_BASE); ir < lastir; ir++) {
2206 ir->prev = REGSP_INIT;
2207 if (irt_is64(ir->t) && ir->o != IR_KNULL) {
2208#if LJ_GC64
2209 /* The false-positive of irt_is64() for ASMREF_L (REF_NIL) is OK here. */
2210 ir->i = 0; /* Will become non-zero only for RIP-relative addresses. */
2211#else
2212 /* Make life easier for backends by putting address of constant in i. */
2213 ir->i = (int32_t)(intptr_t)(ir+1);
2214#endif
2215 ir++;
2216 }
2217 }
2218
2219 /* REF_BASE is used for implicit references to the BASE register. */
2220 lastir->prev = REGSP_HINT(RID_BASE);
2221
2222 as->snaprename = nins;
2223 as->snapref = nins;
2224 as->snapno = T->nsnap;
2225 as->snapalloc = 0;
2226
2227 as->stopins = REF_BASE;
2228 as->orignins = nins;
2229 as->curins = nins;
2230
2231 /* Setup register hints for parent link instructions. */
2232 ir = IR(REF_FIRST);
2233 if (as->parent) {
2234 uint16_t *p;
2235 lastir = lj_snap_regspmap(as->J, as->parent, as->J->exitno, ir);
2236 if (lastir - ir > LJ_MAX_JSLOTS)
2237 lj_trace_err(as->J, LJ_TRERR_NYICOAL);
2238 as->stopins = (IRRef)((lastir-1) - as->ir);
2239 for (p = as->parentmap; ir < lastir; ir++) {
2240 RegSP rs = ir->prev;
2241 *p++ = (uint16_t)rs; /* Copy original parent RegSP to parentmap. */
2242 if (!ra_hasspill(regsp_spill(rs)))
2243 ir->prev = (uint16_t)REGSP_HINT(regsp_reg(rs));
2244 else
2245 ir->prev = REGSP_INIT;
2246 }
2247 }
2248
2249 inloop = 0;
2250 as->evenspill = SPS_FIRST;
2251 for (lastir = IR(nins); ir < lastir; ir++) {
2252 if (sink) {
2253 if (ir->r == RID_SINK)
2254 continue;
2255 if (ir->r == RID_SUNK) { /* Revert after ASM restart. */
2256 ir->r = RID_SINK;
2257 continue;
2258 }
2259 }
2260 switch (ir->o) {
2261 case IR_LOOP:
2262 inloop = 1;
2263 break;
2264#if LJ_TARGET_ARM
2265 case IR_SLOAD:
2266 if (!((ir->op2 & IRSLOAD_TYPECHECK) || (ir+1)->o == IR_HIOP))
2267 break;
2268 /* fallthrough */
2269 case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:
2270 if (!LJ_SOFTFP && irt_isnum(ir->t)) break;
2271 ir->prev = (uint16_t)REGSP_HINT((rload & 15));
2272 rload = lj_ror(rload, 4);
2273 continue;
2274 case IR_TMPREF:
2275 if ((ir->op2 & IRTMPREF_OUT2) && as->evenspill < 4)
2276 as->evenspill = 4; /* TMPREF OUT2 needs two TValues on the stack. */
2277 break;
2278#endif
2279 case IR_CALLXS: {
2280 CCallInfo ci;
2281 ci.flags = asm_callx_flags(as, ir);
2282 ir->prev = asm_setup_call_slots(as, ir, &ci);
2283 if (inloop)
2284 as->modset |= RSET_SCRATCH;
2285 continue;
2286 }
2287 case IR_CALLL:
2288 /* lj_vm_next needs two TValues on the stack. */
2289#if LJ_TARGET_X64 && LJ_ABI_WIN
2290 if (ir->op2 == IRCALL_lj_vm_next && as->evenspill < SPS_FIRST + 4)
2291 as->evenspill = SPS_FIRST + 4;
2292#else
2293 if (SPS_FIRST < 4 && ir->op2 == IRCALL_lj_vm_next && as->evenspill < 4)
2294 as->evenspill = 4;
2295#endif
2296 /* fallthrough */
2297 case IR_CALLN: case IR_CALLA: case IR_CALLS: {
2298 const CCallInfo *ci = &lj_ir_callinfo[ir->op2];
2299 ir->prev = asm_setup_call_slots(as, ir, ci);
2300 if (inloop)
2301 as->modset |= (ci->flags & CCI_NOFPRCLOBBER) ?
2302 (RSET_SCRATCH & ~RSET_FPR) : RSET_SCRATCH;
2303 continue;
2304 }
2305 case IR_HIOP:
2306 switch ((ir-1)->o) {
2307#if LJ_SOFTFP && LJ_TARGET_ARM
2308 case IR_SLOAD: case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:
2309 if (ra_hashint((ir-1)->r)) {
2310 ir->prev = (ir-1)->prev + 1;
2311 continue;
2312 }
2313 break;
2314#endif
2315#if !LJ_SOFTFP && LJ_NEED_FP64 && LJ_32 && LJ_HASFFI
2316 case IR_CONV:
2317 if (irt_isfp((ir-1)->t)) {
2318 ir->prev = REGSP_HINT(RID_FPRET);
2319 continue;
2320 }
2321#endif
2322 /* fallthrough */
2323 case IR_CALLN: case IR_CALLL: case IR_CALLS: case IR_CALLXS:
2324#if LJ_SOFTFP
2325 case IR_MIN: case IR_MAX:
2326#endif
2327 (ir-1)->prev = REGSP_HINT(RID_RETLO);
2328 ir->prev = REGSP_HINT(RID_RETHI);
2329 continue;
2330 default:
2331 break;
2332 }
2333 break;
2334#if LJ_SOFTFP
2335 case IR_MIN: case IR_MAX:
2336 if ((ir+1)->o != IR_HIOP) break;
2337#endif
2338 /* fallthrough */
2339 /* C calls evict all scratch regs and return results in RID_RET. */
2340 case IR_SNEW: case IR_XSNEW: case IR_NEWREF: case IR_BUFPUT:
2341 if (REGARG_NUMGPR < 3 && as->evenspill < 3)
2342 as->evenspill = 3; /* lj_str_new and lj_tab_newkey need 3 args. */
2343#if LJ_TARGET_X86 && LJ_HASFFI
2344 if (0) {
2345 case IR_CNEW:
2346 if (ir->op2 != REF_NIL && as->evenspill < 4)
2347 as->evenspill = 4; /* lj_cdata_newv needs 4 args. */
2348 }
2349 /* fallthrough */
2350#else
2351 /* fallthrough */
2352 case IR_CNEW:
2353#endif
2354 /* fallthrough */
2355 case IR_TNEW: case IR_TDUP: case IR_CNEWI: case IR_TOSTR:
2356 case IR_BUFSTR:
2357 ir->prev = REGSP_HINT(RID_RET);
2358 if (inloop)
2359 as->modset = RSET_SCRATCH;
2360 continue;
2361 case IR_STRTO: case IR_OBAR:
2362 if (inloop)
2363 as->modset = RSET_SCRATCH;
2364 break;
2365#if !LJ_SOFTFP
2366#if !LJ_TARGET_X86ORX64
2367 case IR_LDEXP:
2368#endif
2369#endif
2370 /* fallthrough */
2371 case IR_POW:
2372 if (!LJ_SOFTFP && irt_isnum(ir->t)) {
2373 if (inloop)
2374 as->modset |= RSET_SCRATCH;
2375#if LJ_TARGET_X86
2376 if (irt_isnum(IR(ir->op2)->t)) {
2377 if (as->evenspill < 4) /* Leave room to call pow(). */
2378 as->evenspill = 4;
2379 }
2380 break;
2381#else
2382 ir->prev = REGSP_HINT(RID_FPRET);
2383 continue;
2384#endif
2385 }
2386 /* fallthrough */ /* for integer POW */
2387 case IR_DIV: case IR_MOD:
2388 if ((LJ_64 && LJ_SOFTFP) || !irt_isnum(ir->t)) {
2389 ir->prev = REGSP_HINT(RID_RET);
2390 if (inloop)
2391 as->modset |= (RSET_SCRATCH & RSET_GPR);
2392 continue;
2393 }
2394 break;
2395#if LJ_64 && LJ_SOFTFP
2396 case IR_ADD: case IR_SUB: case IR_MUL:
2397 if (irt_isnum(ir->t)) {
2398 ir->prev = REGSP_HINT(RID_RET);
2399 if (inloop)
2400 as->modset |= (RSET_SCRATCH & RSET_GPR);
2401 continue;
2402 }
2403 break;
2404#endif
2405 case IR_FPMATH:
2406#if LJ_TARGET_X86ORX64
2407 if (ir->op2 <= IRFPM_TRUNC) {
2408 if (!(as->flags & JIT_F_SSE4_1)) {
2409 ir->prev = REGSP_HINT(RID_XMM0);
2410 if (inloop)
2411 as->modset |= RSET_RANGE(RID_XMM0, RID_XMM3+1)|RID2RSET(RID_EAX);
2412 continue;
2413 }
2414 break;
2415 }
2416#endif
2417 if (inloop)
2418 as->modset |= RSET_SCRATCH;
2419#if LJ_TARGET_X86
2420 break;
2421#else
2422 ir->prev = REGSP_HINT(RID_FPRET);
2423 continue;
2424#endif
2425#if LJ_TARGET_X86ORX64
2426 /* Non-constant shift counts need to be in RID_ECX on x86/x64. */
2427 case IR_BSHL: case IR_BSHR: case IR_BSAR:
2428 if ((as->flags & JIT_F_BMI2)) /* Except if BMI2 is available. */
2429 break;
2430 /* fallthrough */
2431 case IR_BROL: case IR_BROR:
2432 if (!irref_isk(ir->op2) && !ra_hashint(IR(ir->op2)->r)) {
2433 IR(ir->op2)->r = REGSP_HINT(RID_ECX);
2434 if (inloop)
2435 rset_set(as->modset, RID_ECX);
2436 }
2437 break;
2438#endif
2439 /* Do not propagate hints across type conversions or loads. */
2440 case IR_TOBIT:
2441 case IR_XLOAD:
2442#if !LJ_TARGET_ARM
2443 case IR_ALOAD: case IR_HLOAD: case IR_ULOAD: case IR_VLOAD:
2444#endif
2445 break;
2446 case IR_CONV:
2447 if (irt_isfp(ir->t) || (ir->op2 & IRCONV_SRCMASK) == IRT_NUM ||
2448 (ir->op2 & IRCONV_SRCMASK) == IRT_FLOAT)
2449 break;
2450 /* fallthrough */
2451 default:
2452 /* Propagate hints across likely 'op reg, imm' or 'op reg'. */
2453 if (irref_isk(ir->op2) && !irref_isk(ir->op1) &&
2454 ra_hashint(regsp_reg(IR(ir->op1)->prev))) {
2455 ir->prev = IR(ir->op1)->prev;
2456 continue;
2457 }
2458 break;
2459 }
2460 ir->prev = REGSP_INIT;
2461 }
2462 if ((as->evenspill & 1))
2463 as->oddspill = as->evenspill++;
2464 else
2465 as->oddspill = 0;
2466}
2467
2468/* -- Assembler core ------------------------------------------------------ */
2469
2470/* Assemble a trace. */
2471void lj_asm_trace(jit_State *J, GCtrace *T)
2472{
2473 ASMState as_;
2474 ASMState *as = &as_;
2475
2476 /* Remove nops/renames left over from ASM restart due to LJ_TRERR_MCODELM. */
2477 {
2478 IRRef nins = T->nins;
2479 IRIns *ir = &T->ir[nins-1];
2480 if (ir->o == IR_NOP || ir->o == IR_RENAME) {
2481 do { ir--; nins--; } while (ir->o == IR_NOP || ir->o == IR_RENAME);
2482 T->nins = nins;
2483 }
2484 }
2485
2486 /* Ensure an initialized instruction beyond the last one for HIOP checks. */
2487 /* This also allows one RENAME to be added without reallocating curfinal. */
2488 as->orignins = lj_ir_nextins(J);
2489 lj_ir_nop(&J->cur.ir[as->orignins]);
2490
2491 /* Setup initial state. Copy some fields to reduce indirections. */
2492 as->J = J;
2493 as->T = T;
2494 J->curfinal = lj_trace_alloc(J->L, T); /* This copies the IR, too. */
2495 as->flags = J->flags;
2496 as->loopref = J->loopref;
2497 as->realign = NULL;
2498 as->loopinv = 0;
2499 as->parent = J->parent ? traceref(J, J->parent) : NULL;
2500#ifdef LUAJIT_RANDOM_RA
2501 (void)lj_prng_u64(&J2G(J)->prng); /* Ensure PRNG step between traces. */
2502#endif
2503
2504 /* Reserve MCode memory. */
2505 as->mctop = as->mctoporig = lj_mcode_reserve(J, &as->mcbot);
2506 as->mcp = as->mctop;
2507 as->mclim = as->mcbot + MCLIM_REDZONE;
2508 asm_setup_target(as);
2509
2510 /*
2511 ** This is a loop, because the MCode may have to be (re-)assembled
2512 ** multiple times:
2513 **
2514 ** 1. as->realign is set (and the assembly aborted), if the arch-specific
2515 ** backend wants the MCode to be aligned differently.
2516 **
2517 ** This is currently only the case on x86/x64, where small loops get
2518 ** an aligned loop body plus a short branch. Not much effort is wasted,
2519 ** because the abort happens very quickly and only once.
2520 **
2521 ** 2. The IR is immovable, since the MCode embeds pointers to various
2522 ** constants inside the IR. But RENAMEs may need to be added to the IR
2523 ** during assembly, which might grow and reallocate the IR. We check
2524 ** at the end if the IR (in J->cur.ir) has actually grown, resize the
2525 ** copy (in J->curfinal.ir) and try again.
2526 **
2527 ** 95% of all traces have zero RENAMEs, 3% have one RENAME, 1.5% have
2528 ** 2 RENAMEs and only 0.5% have more than that. That's why we opt to
2529 ** always have one spare slot in the IR (see above), which means we
2530 ** have to redo the assembly for only ~2% of all traces.
2531 **
2532 ** Very, very rarely, this needs to be done repeatedly, since the
2533 ** location of constants inside the IR (actually, reachability from
2534 ** a global pointer) may affect register allocation and thus the
2535 ** number of RENAMEs.
2536 */
2537 for (;;) {
2538 as->mcp = as->mctop;
2539#ifdef LUA_USE_ASSERT
2540 as->mcp_prev = as->mcp;
2541#endif
2542 as->ir = J->curfinal->ir; /* Use the copied IR. */
2543 as->curins = J->cur.nins = as->orignins;
2544#ifdef LUAJIT_RANDOM_RA
2545 as->prngstate = J2G(J)->prng; /* Must (re)start from identical state. */
2546 as->prngbits = 0;
2547#endif
2548
2549 RA_DBG_START();
2550 RA_DBGX((as, "===== STOP ====="));
2551
2552 /* General trace setup. Emit tail of trace. */
2553 asm_tail_prep(as, T->link);
2554 as->mcloop = NULL;
2555 as->flagmcp = NULL;
2556 as->topslot = 0;
2557 as->gcsteps = 0;
2558 as->sectref = as->loopref;
2559 as->fuseref = (as->flags & JIT_F_OPT_FUSE) ? as->loopref : FUSE_DISABLED;
2560 asm_setup_regsp(as);
2561 if (!as->loopref)
2562 asm_tail_link(as);
2563
2564 /* Assemble a trace in linear backwards order. */
2565 for (as->curins--; as->curins > as->stopins; as->curins--) {
2566 IRIns *ir = IR(as->curins);
2567 /* 64 bit types handled by SPLIT for 32 bit archs. */
2568 lj_assertA(!(LJ_32 && irt_isint64(ir->t)),
2569 "IR %04d has unsplit 64 bit type",
2570 (int)(ir - as->ir) - REF_BIAS);
2571 asm_snap_prev(as);
2572 if (!ra_used(ir) && !ir_sideeff(ir) && (as->flags & JIT_F_OPT_DCE))
2573 continue; /* Dead-code elimination can be soooo easy. */
2574 if (irt_isguard(ir->t))
2575 asm_snap_prep(as);
2576 RA_DBG_REF();
2577 checkmclim(as);
2578 asm_ir(as, ir);
2579 }
2580
2581 if (as->realign && J->curfinal->nins >= T->nins)
2582 continue; /* Retry in case only the MCode needs to be realigned. */
2583
2584 /* Emit head of trace. */
2585 RA_DBG_REF();
2586 checkmclim(as);
2587 if (as->gcsteps > 0) {
2588 as->curins = as->T->snap[0].ref;
2589 asm_snap_prep(as); /* The GC check is a guard. */
2590 asm_gc_check(as);
2591 as->curins = as->stopins;
2592 }
2593 ra_evictk(as);
2594 if (as->parent)
2595 asm_head_side(as);
2596 else
2597 asm_head_root(as);
2598#if LJ_ABI_BRANCH_TRACK
2599 emit_branch_track(as);
2600#endif
2601 asm_phi_fixup(as);
2602
2603 if (J->curfinal->nins >= T->nins) { /* IR didn't grow? */
2604 lj_assertA(J->curfinal->nk == T->nk, "unexpected IR constant growth");
2605 memcpy(J->curfinal->ir + as->orignins, T->ir + as->orignins,
2606 (T->nins - as->orignins) * sizeof(IRIns)); /* Copy RENAMEs. */
2607 T->nins = J->curfinal->nins;
2608 /* Fill mcofs of any unprocessed snapshots. */
2609 as->curins = REF_FIRST;
2610 asm_snap_prev(as);
2611 break; /* Done. */
2612 }
2613
2614 /* Otherwise try again with a bigger IR. */
2615 lj_trace_free(J2G(J), J->curfinal);
2616 J->curfinal = NULL; /* In case lj_trace_alloc() OOMs. */
2617 J->curfinal = lj_trace_alloc(J->L, T);
2618 as->realign = NULL;
2619 }
2620
2621 RA_DBGX((as, "===== START ===="));
2622 RA_DBG_FLUSH();
2623 if (as->freeset != RSET_ALL)
2624 lj_trace_err(as->J, LJ_TRERR_BADRA); /* Ouch! Should never happen. */
2625
2626 /* Set trace entry point before fixing up tail to allow link to self. */
2627 T->mcode = as->mcp;
2628 T->mcloop = as->mcloop ? (MSize)((char *)as->mcloop - (char *)as->mcp) : 0;
2629 if (as->loopref)
2630 asm_loop_tail_fixup(as);
2631 else
2632 asm_tail_fixup(as, T->link); /* Note: this may change as->mctop! */
2633 T->szmcode = (MSize)((char *)as->mctop - (char *)as->mcp);
2634 asm_snap_fixup_mcofs(as);
2635#if LJ_TARGET_MCODE_FIXUP
2636 asm_mcode_fixup(T->mcode, T->szmcode);
2637#endif
2638 lj_mcode_sync(T->mcode, as->mctoporig);
2639}
2640
2641#undef IR
2642
2643#endif