Index: include/llvm/CodeGen/RuntimeLibcalls.h =================================================================== --- include/llvm/CodeGen/RuntimeLibcalls.h +++ include/llvm/CodeGen/RuntimeLibcalls.h @@ -29,7 +29,7 @@ /// enum Libcall { #define HANDLE_LIBCALL(code, name) code, - #include "RuntimeLibcalls.def" + #include "llvm/IR/RuntimeLibcalls.def" #undef HANDLE_LIBCALL }; Index: include/llvm/CodeGen/RuntimeLibcalls.def =================================================================== --- include/llvm/CodeGen/RuntimeLibcalls.def +++ include/llvm/CodeGen/RuntimeLibcalls.def @@ -1,527 +0,0 @@ -//===-- llvm/RuntimeLibcalls.def - File that describes libcalls -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines all of the runtime library calls the backend can emit. -// The various long double types cannot be merged, because 80-bit library -// functions use "xf" and 128-bit use "tf". -// -// When adding PPCF128 functions here, note that their names generally need -// to be overridden for Darwin with the xxx$LDBL128 form. See -// PPCISelLowering.cpp. -// -//===----------------------------------------------------------------------===// - -// NOTE: NO INCLUDE GUARD DESIRED! - -// Provide definitions of macros so that users of this file do not have to -// define everything to use it... - -// Declare the enumerator for each libcall, along with its default name. Some -// libcalls have different names on particular OSes or architectures. These -// are set in InitLibcallNames() in TargetLoweringBase.cpp and/or by targets -// using TargetLoweringBase::setLibcallName() -#ifndef HANDLE_LIBCALL -#error "HANDLE_LIBCALL must be defined" -#endif - -// Integer -HANDLE_LIBCALL(SHL_I16, "__ashlhi3") -HANDLE_LIBCALL(SHL_I32, "__ashlsi3") -HANDLE_LIBCALL(SHL_I64, "__ashldi3") -HANDLE_LIBCALL(SHL_I128, "__ashlti3") -HANDLE_LIBCALL(SRL_I16, "__lshrhi3") -HANDLE_LIBCALL(SRL_I32, "__lshrsi3") -HANDLE_LIBCALL(SRL_I64, "__lshrdi3") -HANDLE_LIBCALL(SRL_I128, "__lshrti3") -HANDLE_LIBCALL(SRA_I16, "__ashrhi3") -HANDLE_LIBCALL(SRA_I32, "__ashrsi3") -HANDLE_LIBCALL(SRA_I64, "__ashrdi3") -HANDLE_LIBCALL(SRA_I128, "__ashrti3") -HANDLE_LIBCALL(MUL_I8, "__mulqi3") -HANDLE_LIBCALL(MUL_I16, "__mulhi3") -HANDLE_LIBCALL(MUL_I32, "__mulsi3") -HANDLE_LIBCALL(MUL_I64, "__muldi3") -HANDLE_LIBCALL(MUL_I128, "__multi3") -HANDLE_LIBCALL(MULO_I32, "__mulosi4") -HANDLE_LIBCALL(MULO_I64, "__mulodi4") -HANDLE_LIBCALL(MULO_I128, "__muloti4") -HANDLE_LIBCALL(SDIV_I8, "__divqi3") -HANDLE_LIBCALL(SDIV_I16, "__divhi3") -HANDLE_LIBCALL(SDIV_I32, "__divsi3") -HANDLE_LIBCALL(SDIV_I64, "__divdi3") -HANDLE_LIBCALL(SDIV_I128, "__divti3") -HANDLE_LIBCALL(UDIV_I8, "__udivqi3") -HANDLE_LIBCALL(UDIV_I16, "__udivhi3") -HANDLE_LIBCALL(UDIV_I32, "__udivsi3") -HANDLE_LIBCALL(UDIV_I64, "__udivdi3") -HANDLE_LIBCALL(UDIV_I128, "__udivti3") -HANDLE_LIBCALL(SREM_I8, "__modqi3") -HANDLE_LIBCALL(SREM_I16, "__modhi3") -HANDLE_LIBCALL(SREM_I32, "__modsi3") -HANDLE_LIBCALL(SREM_I64, "__moddi3") -HANDLE_LIBCALL(SREM_I128, "__modti3") -HANDLE_LIBCALL(UREM_I8, "__umodqi3") -HANDLE_LIBCALL(UREM_I16, "__umodhi3") -HANDLE_LIBCALL(UREM_I32, "__umodsi3") -HANDLE_LIBCALL(UREM_I64, "__umoddi3") -HANDLE_LIBCALL(UREM_I128, "__umodti3") -HANDLE_LIBCALL(SDIVREM_I8, nullptr) -HANDLE_LIBCALL(SDIVREM_I16, nullptr) -HANDLE_LIBCALL(SDIVREM_I32, nullptr) -HANDLE_LIBCALL(SDIVREM_I64, nullptr) -HANDLE_LIBCALL(SDIVREM_I128, nullptr) -HANDLE_LIBCALL(UDIVREM_I8, nullptr) -HANDLE_LIBCALL(UDIVREM_I16, nullptr) -HANDLE_LIBCALL(UDIVREM_I32, nullptr) -HANDLE_LIBCALL(UDIVREM_I64, nullptr) -HANDLE_LIBCALL(UDIVREM_I128, nullptr) -HANDLE_LIBCALL(NEG_I32, "__negsi2") -HANDLE_LIBCALL(NEG_I64, "__negdi2") - -// Floating-point -HANDLE_LIBCALL(ADD_F32, "__addsf3") -HANDLE_LIBCALL(ADD_F64, "__adddf3") -HANDLE_LIBCALL(ADD_F80, "__addxf3") -HANDLE_LIBCALL(ADD_F128, "__addtf3") -HANDLE_LIBCALL(ADD_PPCF128, "__gcc_qadd") -HANDLE_LIBCALL(SUB_F32, "__subsf3") -HANDLE_LIBCALL(SUB_F64, "__subdf3") -HANDLE_LIBCALL(SUB_F80, "__subxf3") -HANDLE_LIBCALL(SUB_F128, "__subtf3") -HANDLE_LIBCALL(SUB_PPCF128, "__gcc_qsub") -HANDLE_LIBCALL(MUL_F32, "__mulsf3") -HANDLE_LIBCALL(MUL_F64, "__muldf3") -HANDLE_LIBCALL(MUL_F80, "__mulxf3") -HANDLE_LIBCALL(MUL_F128, "__multf3") -HANDLE_LIBCALL(MUL_PPCF128, "__gcc_qmul") -HANDLE_LIBCALL(DIV_F32, "__divsf3") -HANDLE_LIBCALL(DIV_F64, "__divdf3") -HANDLE_LIBCALL(DIV_F80, "__divxf3") -HANDLE_LIBCALL(DIV_F128, "__divtf3") -HANDLE_LIBCALL(DIV_PPCF128, "__gcc_qdiv") -HANDLE_LIBCALL(REM_F32, "fmodf") -HANDLE_LIBCALL(REM_F64, "fmod") -HANDLE_LIBCALL(REM_F80, "fmodl") -HANDLE_LIBCALL(REM_F128, "fmodl") -HANDLE_LIBCALL(REM_PPCF128, "fmodl") -HANDLE_LIBCALL(FMA_F32, "fmaf") -HANDLE_LIBCALL(FMA_F64, "fma") -HANDLE_LIBCALL(FMA_F80, "fmal") -HANDLE_LIBCALL(FMA_F128, "fmal") -HANDLE_LIBCALL(FMA_PPCF128, "fmal") -HANDLE_LIBCALL(POWI_F32, "__powisf2") -HANDLE_LIBCALL(POWI_F64, "__powidf2") -HANDLE_LIBCALL(POWI_F80, "__powixf2") -HANDLE_LIBCALL(POWI_F128, "__powitf2") -HANDLE_LIBCALL(POWI_PPCF128, "__powitf2") -HANDLE_LIBCALL(SQRT_F32, "sqrtf") -HANDLE_LIBCALL(SQRT_F64, "sqrt") -HANDLE_LIBCALL(SQRT_F80, "sqrtl") -HANDLE_LIBCALL(SQRT_F128, "sqrtl") -HANDLE_LIBCALL(SQRT_PPCF128, "sqrtl") -HANDLE_LIBCALL(LOG_F32, "logf") -HANDLE_LIBCALL(LOG_F64, "log") -HANDLE_LIBCALL(LOG_F80, "logl") -HANDLE_LIBCALL(LOG_F128, "logl") -HANDLE_LIBCALL(LOG_PPCF128, "logl") -HANDLE_LIBCALL(LOG_FINITE_F32, "__logf_finite") -HANDLE_LIBCALL(LOG_FINITE_F64, "__log_finite") -HANDLE_LIBCALL(LOG_FINITE_F80, "__logl_finite") -HANDLE_LIBCALL(LOG_FINITE_F128, "__logl_finite") -HANDLE_LIBCALL(LOG_FINITE_PPCF128, "__logl_finite") -HANDLE_LIBCALL(LOG2_F32, "log2f") -HANDLE_LIBCALL(LOG2_F64, "log2") -HANDLE_LIBCALL(LOG2_F80, "log2l") -HANDLE_LIBCALL(LOG2_F128, "log2l") -HANDLE_LIBCALL(LOG2_PPCF128, "log2l") -HANDLE_LIBCALL(LOG2_FINITE_F32, "__log2f_finite") -HANDLE_LIBCALL(LOG2_FINITE_F64, "__log2_finite") -HANDLE_LIBCALL(LOG2_FINITE_F80, "__log2l_finite") -HANDLE_LIBCALL(LOG2_FINITE_F128, "__log2l_finite") -HANDLE_LIBCALL(LOG2_FINITE_PPCF128, "__log2l_finite") -HANDLE_LIBCALL(LOG10_F32, "log10f") -HANDLE_LIBCALL(LOG10_F64, "log10") -HANDLE_LIBCALL(LOG10_F80, "log10l") -HANDLE_LIBCALL(LOG10_F128, "log10l") -HANDLE_LIBCALL(LOG10_PPCF128, "log10l") -HANDLE_LIBCALL(LOG10_FINITE_F32, "__log10f_finite") -HANDLE_LIBCALL(LOG10_FINITE_F64, "__log10_finite") -HANDLE_LIBCALL(LOG10_FINITE_F80, "__log10l_finite") -HANDLE_LIBCALL(LOG10_FINITE_F128, "__log10l_finite") -HANDLE_LIBCALL(LOG10_FINITE_PPCF128, "__log10l_finite") -HANDLE_LIBCALL(EXP_F32, "expf") -HANDLE_LIBCALL(EXP_F64, "exp") -HANDLE_LIBCALL(EXP_F80, "expl") -HANDLE_LIBCALL(EXP_F128, "expl") -HANDLE_LIBCALL(EXP_PPCF128, "expl") -HANDLE_LIBCALL(EXP_FINITE_F32, "__expf_finite") -HANDLE_LIBCALL(EXP_FINITE_F64, "__exp_finite") -HANDLE_LIBCALL(EXP_FINITE_F80, "__expl_finite") -HANDLE_LIBCALL(EXP_FINITE_F128, "__expl_finite") -HANDLE_LIBCALL(EXP_FINITE_PPCF128, "__expl_finite") -HANDLE_LIBCALL(EXP2_F32, "exp2f") -HANDLE_LIBCALL(EXP2_F64, "exp2") -HANDLE_LIBCALL(EXP2_F80, "exp2l") -HANDLE_LIBCALL(EXP2_F128, "exp2l") -HANDLE_LIBCALL(EXP2_PPCF128, "exp2l") -HANDLE_LIBCALL(EXP2_FINITE_F32, "__exp2f_finite") -HANDLE_LIBCALL(EXP2_FINITE_F64, "__exp2_finite") -HANDLE_LIBCALL(EXP2_FINITE_F80, "__exp2l_finite") -HANDLE_LIBCALL(EXP2_FINITE_F128, "__exp2l_finite") -HANDLE_LIBCALL(EXP2_FINITE_PPCF128, "__exp2l_finite") -HANDLE_LIBCALL(SIN_F32, "sinf") -HANDLE_LIBCALL(SIN_F64, "sin") -HANDLE_LIBCALL(SIN_F80, "sinl") -HANDLE_LIBCALL(SIN_F128, "sinl") -HANDLE_LIBCALL(SIN_PPCF128, "sinl") -HANDLE_LIBCALL(COS_F32, "cosf") -HANDLE_LIBCALL(COS_F64, "cos") -HANDLE_LIBCALL(COS_F80, "cosl") -HANDLE_LIBCALL(COS_F128, "cosl") -HANDLE_LIBCALL(COS_PPCF128, "cosl") -HANDLE_LIBCALL(SINCOS_F32, nullptr) -HANDLE_LIBCALL(SINCOS_F64, nullptr) -HANDLE_LIBCALL(SINCOS_F80, nullptr) -HANDLE_LIBCALL(SINCOS_F128, nullptr) -HANDLE_LIBCALL(SINCOS_PPCF128, nullptr) -HANDLE_LIBCALL(SINCOS_STRET_F32, nullptr) -HANDLE_LIBCALL(SINCOS_STRET_F64, nullptr) -HANDLE_LIBCALL(POW_F32, "powf") -HANDLE_LIBCALL(POW_F64, "pow") -HANDLE_LIBCALL(POW_F80, "powl") -HANDLE_LIBCALL(POW_F128, "powl") -HANDLE_LIBCALL(POW_PPCF128, "powl") -HANDLE_LIBCALL(POW_FINITE_F32, "__powf_finite") -HANDLE_LIBCALL(POW_FINITE_F64, "__pow_finite") -HANDLE_LIBCALL(POW_FINITE_F80, "__powl_finite") -HANDLE_LIBCALL(POW_FINITE_F128, "__powl_finite") -HANDLE_LIBCALL(POW_FINITE_PPCF128, "__powl_finite") -HANDLE_LIBCALL(CEIL_F32, "ceilf") -HANDLE_LIBCALL(CEIL_F64, "ceil") -HANDLE_LIBCALL(CEIL_F80, "ceill") -HANDLE_LIBCALL(CEIL_F128, "ceill") -HANDLE_LIBCALL(CEIL_PPCF128, "ceill") -HANDLE_LIBCALL(TRUNC_F32, "truncf") -HANDLE_LIBCALL(TRUNC_F64, "trunc") -HANDLE_LIBCALL(TRUNC_F80, "truncl") -HANDLE_LIBCALL(TRUNC_F128, "truncl") -HANDLE_LIBCALL(TRUNC_PPCF128, "truncl") -HANDLE_LIBCALL(RINT_F32, "rintf") -HANDLE_LIBCALL(RINT_F64, "rint") -HANDLE_LIBCALL(RINT_F80, "rintl") -HANDLE_LIBCALL(RINT_F128, "rintl") -HANDLE_LIBCALL(RINT_PPCF128, "rintl") -HANDLE_LIBCALL(NEARBYINT_F32, "nearbyintf") -HANDLE_LIBCALL(NEARBYINT_F64, "nearbyint") -HANDLE_LIBCALL(NEARBYINT_F80, "nearbyintl") -HANDLE_LIBCALL(NEARBYINT_F128, "nearbyintl") -HANDLE_LIBCALL(NEARBYINT_PPCF128, "nearbyintl") -HANDLE_LIBCALL(ROUND_F32, "roundf") -HANDLE_LIBCALL(ROUND_F64, "round") -HANDLE_LIBCALL(ROUND_F80, "roundl") -HANDLE_LIBCALL(ROUND_F128, "roundl") -HANDLE_LIBCALL(ROUND_PPCF128, "roundl") -HANDLE_LIBCALL(FLOOR_F32, "floorf") -HANDLE_LIBCALL(FLOOR_F64, "floor") -HANDLE_LIBCALL(FLOOR_F80, "floorl") -HANDLE_LIBCALL(FLOOR_F128, "floorl") -HANDLE_LIBCALL(FLOOR_PPCF128, "floorl") -HANDLE_LIBCALL(COPYSIGN_F32, "copysignf") -HANDLE_LIBCALL(COPYSIGN_F64, "copysign") -HANDLE_LIBCALL(COPYSIGN_F80, "copysignl") -HANDLE_LIBCALL(COPYSIGN_F128, "copysignl") -HANDLE_LIBCALL(COPYSIGN_PPCF128, "copysignl") -HANDLE_LIBCALL(FMIN_F32, "fminf") -HANDLE_LIBCALL(FMIN_F64, "fmin") -HANDLE_LIBCALL(FMIN_F80, "fminl") -HANDLE_LIBCALL(FMIN_F128, "fminl") -HANDLE_LIBCALL(FMIN_PPCF128, "fminl") -HANDLE_LIBCALL(FMAX_F32, "fmaxf") -HANDLE_LIBCALL(FMAX_F64, "fmax") -HANDLE_LIBCALL(FMAX_F80, "fmaxl") -HANDLE_LIBCALL(FMAX_F128, "fmaxl") -HANDLE_LIBCALL(FMAX_PPCF128, "fmaxl") - -// Conversion -HANDLE_LIBCALL(FPEXT_F32_PPCF128, "__gcc_stoq") -HANDLE_LIBCALL(FPEXT_F64_PPCF128, "__gcc_dtoq") -HANDLE_LIBCALL(FPEXT_F80_F128, "__extendxftf2") -HANDLE_LIBCALL(FPEXT_F64_F128, "__extenddftf2") -HANDLE_LIBCALL(FPEXT_F32_F128, "__extendsftf2") -HANDLE_LIBCALL(FPEXT_F32_F64, "__extendsfdf2") -HANDLE_LIBCALL(FPEXT_F16_F32, "__gnu_h2f_ieee") -HANDLE_LIBCALL(FPROUND_F32_F16, "__gnu_f2h_ieee") -HANDLE_LIBCALL(FPROUND_F64_F16, "__truncdfhf2") -HANDLE_LIBCALL(FPROUND_F80_F16, "__truncxfhf2") -HANDLE_LIBCALL(FPROUND_F128_F16, "__trunctfhf2") -HANDLE_LIBCALL(FPROUND_PPCF128_F16, "__trunctfhf2") -HANDLE_LIBCALL(FPROUND_F64_F32, "__truncdfsf2") -HANDLE_LIBCALL(FPROUND_F80_F32, "__truncxfsf2") -HANDLE_LIBCALL(FPROUND_F128_F32, "__trunctfsf2") -HANDLE_LIBCALL(FPROUND_PPCF128_F32, "__gcc_qtos") -HANDLE_LIBCALL(FPROUND_F80_F64, "__truncxfdf2") -HANDLE_LIBCALL(FPROUND_F128_F64, "__trunctfdf2") -HANDLE_LIBCALL(FPROUND_PPCF128_F64, "__gcc_qtod") -HANDLE_LIBCALL(FPROUND_F128_F80, "__trunctfxf2") -HANDLE_LIBCALL(FPTOSINT_F32_I32, "__fixsfsi") -HANDLE_LIBCALL(FPTOSINT_F32_I64, "__fixsfdi") -HANDLE_LIBCALL(FPTOSINT_F32_I128, "__fixsfti") -HANDLE_LIBCALL(FPTOSINT_F64_I32, "__fixdfsi") -HANDLE_LIBCALL(FPTOSINT_F64_I64, "__fixdfdi") -HANDLE_LIBCALL(FPTOSINT_F64_I128, "__fixdfti") -HANDLE_LIBCALL(FPTOSINT_F80_I32, "__fixxfsi") -HANDLE_LIBCALL(FPTOSINT_F80_I64, "__fixxfdi") -HANDLE_LIBCALL(FPTOSINT_F80_I128, "__fixxfti") -HANDLE_LIBCALL(FPTOSINT_F128_I32, "__fixtfsi") -HANDLE_LIBCALL(FPTOSINT_F128_I64, "__fixtfdi") -HANDLE_LIBCALL(FPTOSINT_F128_I128, "__fixtfti") -HANDLE_LIBCALL(FPTOSINT_PPCF128_I32, "__gcc_qtou") -HANDLE_LIBCALL(FPTOSINT_PPCF128_I64, "__fixtfdi") -HANDLE_LIBCALL(FPTOSINT_PPCF128_I128, "__fixtfti") -HANDLE_LIBCALL(FPTOUINT_F32_I32, "__fixunssfsi") -HANDLE_LIBCALL(FPTOUINT_F32_I64, "__fixunssfdi") -HANDLE_LIBCALL(FPTOUINT_F32_I128, "__fixunssfti") -HANDLE_LIBCALL(FPTOUINT_F64_I32, "__fixunsdfsi") -HANDLE_LIBCALL(FPTOUINT_F64_I64, "__fixunsdfdi") -HANDLE_LIBCALL(FPTOUINT_F64_I128, "__fixunsdfti") -HANDLE_LIBCALL(FPTOUINT_F80_I32, "__fixunsxfsi") -HANDLE_LIBCALL(FPTOUINT_F80_I64, "__fixunsxfdi") -HANDLE_LIBCALL(FPTOUINT_F80_I128, "__fixunsxfti") -HANDLE_LIBCALL(FPTOUINT_F128_I32, "__fixunstfsi") -HANDLE_LIBCALL(FPTOUINT_F128_I64, "__fixunstfdi") -HANDLE_LIBCALL(FPTOUINT_F128_I128, "__fixunstfti") -HANDLE_LIBCALL(FPTOUINT_PPCF128_I32, "__fixunstfsi") -HANDLE_LIBCALL(FPTOUINT_PPCF128_I64, "__fixunstfdi") -HANDLE_LIBCALL(FPTOUINT_PPCF128_I128, "__fixunstfti") -HANDLE_LIBCALL(SINTTOFP_I32_F32, "__floatsisf") -HANDLE_LIBCALL(SINTTOFP_I32_F64, "__floatsidf") -HANDLE_LIBCALL(SINTTOFP_I32_F80, "__floatsixf") -HANDLE_LIBCALL(SINTTOFP_I32_F128, "__floatsitf") -HANDLE_LIBCALL(SINTTOFP_I32_PPCF128, "__gcc_itoq") -HANDLE_LIBCALL(SINTTOFP_I64_F32, "__floatdisf") -HANDLE_LIBCALL(SINTTOFP_I64_F64, "__floatdidf") -HANDLE_LIBCALL(SINTTOFP_I64_F80, "__floatdixf") -HANDLE_LIBCALL(SINTTOFP_I64_F128, "__floatditf") -HANDLE_LIBCALL(SINTTOFP_I64_PPCF128, "__floatditf") -HANDLE_LIBCALL(SINTTOFP_I128_F32, "__floattisf") -HANDLE_LIBCALL(SINTTOFP_I128_F64, "__floattidf") -HANDLE_LIBCALL(SINTTOFP_I128_F80, "__floattixf") -HANDLE_LIBCALL(SINTTOFP_I128_F128, "__floattitf") -HANDLE_LIBCALL(SINTTOFP_I128_PPCF128, "__floattitf") -HANDLE_LIBCALL(UINTTOFP_I32_F32, "__floatunsisf") -HANDLE_LIBCALL(UINTTOFP_I32_F64, "__floatunsidf") -HANDLE_LIBCALL(UINTTOFP_I32_F80, "__floatunsixf") -HANDLE_LIBCALL(UINTTOFP_I32_F128, "__floatunsitf") -HANDLE_LIBCALL(UINTTOFP_I32_PPCF128, "__gcc_utoq") -HANDLE_LIBCALL(UINTTOFP_I64_F32, "__floatundisf") -HANDLE_LIBCALL(UINTTOFP_I64_F64, "__floatundidf") -HANDLE_LIBCALL(UINTTOFP_I64_F80, "__floatundixf") -HANDLE_LIBCALL(UINTTOFP_I64_F128, "__floatunditf") -HANDLE_LIBCALL(UINTTOFP_I64_PPCF128, "__floatunditf") -HANDLE_LIBCALL(UINTTOFP_I128_F32, "__floatuntisf") -HANDLE_LIBCALL(UINTTOFP_I128_F64, "__floatuntidf") -HANDLE_LIBCALL(UINTTOFP_I128_F80, "__floatuntixf") -HANDLE_LIBCALL(UINTTOFP_I128_F128, "__floatuntitf") -HANDLE_LIBCALL(UINTTOFP_I128_PPCF128, "__floatuntitf") - -// Comparison -HANDLE_LIBCALL(OEQ_F32, "__eqsf2") -HANDLE_LIBCALL(OEQ_F64, "__eqdf2") -HANDLE_LIBCALL(OEQ_F128, "__eqtf2") -HANDLE_LIBCALL(OEQ_PPCF128, "__gcc_qeq") -HANDLE_LIBCALL(UNE_F32, "__nesf2") -HANDLE_LIBCALL(UNE_F64, "__nedf2") -HANDLE_LIBCALL(UNE_F128, "__netf2") -HANDLE_LIBCALL(UNE_PPCF128, "__gcc_qne") -HANDLE_LIBCALL(OGE_F32, "__gesf2") -HANDLE_LIBCALL(OGE_F64, "__gedf2") -HANDLE_LIBCALL(OGE_F128, "__getf2") -HANDLE_LIBCALL(OGE_PPCF128, "__gcc_qge") -HANDLE_LIBCALL(OLT_F32, "__ltsf2") -HANDLE_LIBCALL(OLT_F64, "__ltdf2") -HANDLE_LIBCALL(OLT_F128, "__lttf2") -HANDLE_LIBCALL(OLT_PPCF128, "__gcc_qlt") -HANDLE_LIBCALL(OLE_F32, "__lesf2") -HANDLE_LIBCALL(OLE_F64, "__ledf2") -HANDLE_LIBCALL(OLE_F128, "__letf2") -HANDLE_LIBCALL(OLE_PPCF128, "__gcc_qle") -HANDLE_LIBCALL(OGT_F32, "__gtsf2") -HANDLE_LIBCALL(OGT_F64, "__gtdf2") -HANDLE_LIBCALL(OGT_F128, "__gttf2") -HANDLE_LIBCALL(OGT_PPCF128, "__gcc_qgt") -HANDLE_LIBCALL(UO_F32, "__unordsf2") -HANDLE_LIBCALL(UO_F64, "__unorddf2") -HANDLE_LIBCALL(UO_F128, "__unordtf2") -HANDLE_LIBCALL(UO_PPCF128, "__gcc_qunord") -HANDLE_LIBCALL(O_F32, "__unordsf2") -HANDLE_LIBCALL(O_F64, "__unorddf2") -HANDLE_LIBCALL(O_F128, "__unordtf2") -HANDLE_LIBCALL(O_PPCF128, "__gcc_qunord") - -// Memory -HANDLE_LIBCALL(MEMCPY, "memcpy") -HANDLE_LIBCALL(MEMMOVE, "memmove") -HANDLE_LIBCALL(MEMSET, "memset") -HANDLE_LIBCALL(BZERO, nullptr) - -// Element-wise unordered-atomic memory of different sizes -HANDLE_LIBCALL(MEMCPY_ELEMENT_UNORDERED_ATOMIC_1, "__llvm_memcpy_element_unordered_atomic_1") -HANDLE_LIBCALL(MEMCPY_ELEMENT_UNORDERED_ATOMIC_2, "__llvm_memcpy_element_unordered_atomic_2") -HANDLE_LIBCALL(MEMCPY_ELEMENT_UNORDERED_ATOMIC_4, "__llvm_memcpy_element_unordered_atomic_4") -HANDLE_LIBCALL(MEMCPY_ELEMENT_UNORDERED_ATOMIC_8, "__llvm_memcpy_element_unordered_atomic_8") -HANDLE_LIBCALL(MEMCPY_ELEMENT_UNORDERED_ATOMIC_16, "__llvm_memcpy_element_unordered_atomic_16") -HANDLE_LIBCALL(MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1, "__llvm_memmove_element_unordered_atomic_1") -HANDLE_LIBCALL(MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2, "__llvm_memmove_element_unordered_atomic_2") -HANDLE_LIBCALL(MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4, "__llvm_memmove_element_unordered_atomic_4") -HANDLE_LIBCALL(MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8, "__llvm_memmove_element_unordered_atomic_8") -HANDLE_LIBCALL(MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16, "__llvm_memmove_element_unordered_atomic_16") -HANDLE_LIBCALL(MEMSET_ELEMENT_UNORDERED_ATOMIC_1, "__llvm_memset_element_unordered_atomic_1") -HANDLE_LIBCALL(MEMSET_ELEMENT_UNORDERED_ATOMIC_2, "__llvm_memset_element_unordered_atomic_2") -HANDLE_LIBCALL(MEMSET_ELEMENT_UNORDERED_ATOMIC_4, "__llvm_memset_element_unordered_atomic_4") -HANDLE_LIBCALL(MEMSET_ELEMENT_UNORDERED_ATOMIC_8, "__llvm_memset_element_unordered_atomic_8") -HANDLE_LIBCALL(MEMSET_ELEMENT_UNORDERED_ATOMIC_16, "__llvm_memset_element_unordered_atomic_16") - -// Exception handling -HANDLE_LIBCALL(UNWIND_RESUME, "_Unwind_Resume") - -// Note: there are two sets of atomics libcalls; see -// for more info on the -// difference between them. - -// Atomic '__sync_*' libcalls. -HANDLE_LIBCALL(SYNC_VAL_COMPARE_AND_SWAP_1, "__sync_val_compare_and_swap_1") -HANDLE_LIBCALL(SYNC_VAL_COMPARE_AND_SWAP_2, "__sync_val_compare_and_swap_2") -HANDLE_LIBCALL(SYNC_VAL_COMPARE_AND_SWAP_4, "__sync_val_compare_and_swap_4") -HANDLE_LIBCALL(SYNC_VAL_COMPARE_AND_SWAP_8, "__sync_val_compare_and_swap_8") -HANDLE_LIBCALL(SYNC_VAL_COMPARE_AND_SWAP_16, "__sync_val_compare_and_swap_16") -HANDLE_LIBCALL(SYNC_LOCK_TEST_AND_SET_1, "__sync_lock_test_and_set_1") -HANDLE_LIBCALL(SYNC_LOCK_TEST_AND_SET_2, "__sync_lock_test_and_set_2") -HANDLE_LIBCALL(SYNC_LOCK_TEST_AND_SET_4, "__sync_lock_test_and_set_4") -HANDLE_LIBCALL(SYNC_LOCK_TEST_AND_SET_8, "__sync_lock_test_and_set_8") -HANDLE_LIBCALL(SYNC_LOCK_TEST_AND_SET_16, "__sync_lock_test_and_set_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_ADD_1, "__sync_fetch_and_add_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_ADD_2, "__sync_fetch_and_add_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_ADD_4, "__sync_fetch_and_add_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_ADD_8, "__sync_fetch_and_add_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_ADD_16, "__sync_fetch_and_add_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_SUB_1, "__sync_fetch_and_sub_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_SUB_2, "__sync_fetch_and_sub_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_SUB_4, "__sync_fetch_and_sub_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_SUB_8, "__sync_fetch_and_sub_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_SUB_16, "__sync_fetch_and_sub_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_AND_1, "__sync_fetch_and_and_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_AND_2, "__sync_fetch_and_and_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_AND_4, "__sync_fetch_and_and_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_AND_8, "__sync_fetch_and_and_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_AND_16, "__sync_fetch_and_and_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_OR_1, "__sync_fetch_and_or_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_OR_2, "__sync_fetch_and_or_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_OR_4, "__sync_fetch_and_or_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_OR_8, "__sync_fetch_and_or_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_OR_16, "__sync_fetch_and_or_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_XOR_1, "__sync_fetch_and_xor_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_XOR_2, "__sync_fetch_and_xor_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_XOR_4, "__sync_fetch_and_xor_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_XOR_8, "__sync_fetch_and_xor_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_XOR_16, "__sync_fetch_and_xor_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_NAND_1, "__sync_fetch_and_nand_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_NAND_2, "__sync_fetch_and_nand_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_NAND_4, "__sync_fetch_and_nand_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_NAND_8, "__sync_fetch_and_nand_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_NAND_16, "__sync_fetch_and_nand_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_MAX_1, "__sync_fetch_and_max_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_MAX_2, "__sync_fetch_and_max_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_MAX_4, "__sync_fetch_and_max_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_MAX_8, "__sync_fetch_and_max_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_MAX_16, "__sync_fetch_and_max_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMAX_1, "__sync_fetch_and_umax_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMAX_2, "__sync_fetch_and_umax_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMAX_4, "__sync_fetch_and_umax_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMAX_8, "__sync_fetch_and_umax_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMAX_16, "__sync_fetch_and_umax_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_MIN_1, "__sync_fetch_and_min_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_MIN_2, "__sync_fetch_and_min_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_MIN_4, "__sync_fetch_and_min_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_MIN_8, "__sync_fetch_and_min_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_MIN_16, "__sync_fetch_and_min_16") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMIN_1, "__sync_fetch_and_umin_1") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMIN_2, "__sync_fetch_and_umin_2") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMIN_4, "__sync_fetch_and_umin_4") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMIN_8, "__sync_fetch_and_umin_8") -HANDLE_LIBCALL(SYNC_FETCH_AND_UMIN_16, "__sync_fetch_and_umin_16") - -// Atomic `__atomic_*' libcalls. -HANDLE_LIBCALL(ATOMIC_LOAD, "__atomic_load") -HANDLE_LIBCALL(ATOMIC_LOAD_1, "__atomic_load_1") -HANDLE_LIBCALL(ATOMIC_LOAD_2, "__atomic_load_2") -HANDLE_LIBCALL(ATOMIC_LOAD_4, "__atomic_load_4") -HANDLE_LIBCALL(ATOMIC_LOAD_8, "__atomic_load_8") -HANDLE_LIBCALL(ATOMIC_LOAD_16, "__atomic_load_16") - -HANDLE_LIBCALL(ATOMIC_STORE, "__atomic_store") -HANDLE_LIBCALL(ATOMIC_STORE_1, "__atomic_store_1") -HANDLE_LIBCALL(ATOMIC_STORE_2, "__atomic_store_2") -HANDLE_LIBCALL(ATOMIC_STORE_4, "__atomic_store_4") -HANDLE_LIBCALL(ATOMIC_STORE_8, "__atomic_store_8") -HANDLE_LIBCALL(ATOMIC_STORE_16, "__atomic_store_16") - -HANDLE_LIBCALL(ATOMIC_EXCHANGE, "__atomic_exchange") -HANDLE_LIBCALL(ATOMIC_EXCHANGE_1, "__atomic_exchange_1") -HANDLE_LIBCALL(ATOMIC_EXCHANGE_2, "__atomic_exchange_2") -HANDLE_LIBCALL(ATOMIC_EXCHANGE_4, "__atomic_exchange_4") -HANDLE_LIBCALL(ATOMIC_EXCHANGE_8, "__atomic_exchange_8") -HANDLE_LIBCALL(ATOMIC_EXCHANGE_16, "__atomic_exchange_16") - -HANDLE_LIBCALL(ATOMIC_COMPARE_EXCHANGE, "__atomic_compare_exchange") -HANDLE_LIBCALL(ATOMIC_COMPARE_EXCHANGE_1, "__atomic_compare_exchange_1") -HANDLE_LIBCALL(ATOMIC_COMPARE_EXCHANGE_2, "__atomic_compare_exchange_2") -HANDLE_LIBCALL(ATOMIC_COMPARE_EXCHANGE_4, "__atomic_compare_exchange_4") -HANDLE_LIBCALL(ATOMIC_COMPARE_EXCHANGE_8, "__atomic_compare_exchange_8") -HANDLE_LIBCALL(ATOMIC_COMPARE_EXCHANGE_16, "__atomic_compare_exchange_16") - -HANDLE_LIBCALL(ATOMIC_FETCH_ADD_1, "__atomic_fetch_add_1") -HANDLE_LIBCALL(ATOMIC_FETCH_ADD_2, "__atomic_fetch_add_2") -HANDLE_LIBCALL(ATOMIC_FETCH_ADD_4, "__atomic_fetch_add_4") -HANDLE_LIBCALL(ATOMIC_FETCH_ADD_8, "__atomic_fetch_add_8") -HANDLE_LIBCALL(ATOMIC_FETCH_ADD_16, "__atomic_fetch_add_16") -HANDLE_LIBCALL(ATOMIC_FETCH_SUB_1, "__atomic_fetch_sub_1") -HANDLE_LIBCALL(ATOMIC_FETCH_SUB_2, "__atomic_fetch_sub_2") -HANDLE_LIBCALL(ATOMIC_FETCH_SUB_4, "__atomic_fetch_sub_4") -HANDLE_LIBCALL(ATOMIC_FETCH_SUB_8, "__atomic_fetch_sub_8") -HANDLE_LIBCALL(ATOMIC_FETCH_SUB_16, "__atomic_fetch_sub_16") -HANDLE_LIBCALL(ATOMIC_FETCH_AND_1, "__atomic_fetch_and_1") -HANDLE_LIBCALL(ATOMIC_FETCH_AND_2, "__atomic_fetch_and_2") -HANDLE_LIBCALL(ATOMIC_FETCH_AND_4, "__atomic_fetch_and_4") -HANDLE_LIBCALL(ATOMIC_FETCH_AND_8, "__atomic_fetch_and_8") -HANDLE_LIBCALL(ATOMIC_FETCH_AND_16, "__atomic_fetch_and_16") -HANDLE_LIBCALL(ATOMIC_FETCH_OR_1, "__atomic_fetch_or_1") -HANDLE_LIBCALL(ATOMIC_FETCH_OR_2, "__atomic_fetch_or_2") -HANDLE_LIBCALL(ATOMIC_FETCH_OR_4, "__atomic_fetch_or_4") -HANDLE_LIBCALL(ATOMIC_FETCH_OR_8, "__atomic_fetch_or_8") -HANDLE_LIBCALL(ATOMIC_FETCH_OR_16, "__atomic_fetch_or_16") -HANDLE_LIBCALL(ATOMIC_FETCH_XOR_1, "__atomic_fetch_xor_1") -HANDLE_LIBCALL(ATOMIC_FETCH_XOR_2, "__atomic_fetch_xor_2") -HANDLE_LIBCALL(ATOMIC_FETCH_XOR_4, "__atomic_fetch_xor_4") -HANDLE_LIBCALL(ATOMIC_FETCH_XOR_8, "__atomic_fetch_xor_8") -HANDLE_LIBCALL(ATOMIC_FETCH_XOR_16, "__atomic_fetch_xor_16") -HANDLE_LIBCALL(ATOMIC_FETCH_NAND_1, "__atomic_fetch_nand_1") -HANDLE_LIBCALL(ATOMIC_FETCH_NAND_2, "__atomic_fetch_nand_2") -HANDLE_LIBCALL(ATOMIC_FETCH_NAND_4, "__atomic_fetch_nand_4") -HANDLE_LIBCALL(ATOMIC_FETCH_NAND_8, "__atomic_fetch_nand_8") -HANDLE_LIBCALL(ATOMIC_FETCH_NAND_16, "__atomic_fetch_nand_16") - -// Stack Protector Fail -HANDLE_LIBCALL(STACKPROTECTOR_CHECK_FAIL, "__stack_chk_fail") - -// Deoptimization -HANDLE_LIBCALL(DEOPTIMIZE, "__llvm_deoptimize") - -HANDLE_LIBCALL(UNKNOWN_LIBCALL, nullptr) - -#undef HANDLE_LIBCALL Index: include/llvm/module.modulemap =================================================================== --- include/llvm/module.modulemap +++ include/llvm/module.modulemap @@ -26,7 +26,6 @@ // These are intended for (repeated) textual inclusion. textual header "CodeGen/CommandFlags.inc" textual header "CodeGen/DIEValue.def" - textual header "CodeGen/RuntimeLibcalls.def" } module Target { @@ -222,6 +221,7 @@ textual header "IR/Instruction.def" textual header "IR/Metadata.def" textual header "IR/Value.def" + textual header "IR/RuntimeLibcalls.def" } module LLVM_IRReader { requires cplusplus umbrella "IRReader" module * { export * } } Index: lib/CodeGen/TargetLoweringBase.cpp =================================================================== --- lib/CodeGen/TargetLoweringBase.cpp +++ lib/CodeGen/TargetLoweringBase.cpp @@ -118,7 +118,7 @@ void TargetLoweringBase::InitLibcalls(const Triple &TT) { #define HANDLE_LIBCALL(code, name) \ setLibcallName(RTLIB::code, name); -#include "llvm/CodeGen/RuntimeLibcalls.def" +#include "llvm/IR/RuntimeLibcalls.def" #undef HANDLE_LIBCALL // Initialize calling conventions to their default. for (int LC = 0; LC < RTLIB::UNKNOWN_LIBCALL; ++LC) Index: lib/Object/IRSymtab.cpp =================================================================== --- lib/Object/IRSymtab.cpp +++ lib/Object/IRSymtab.cpp @@ -42,6 +42,12 @@ using namespace llvm; using namespace irsymtab; +static const char *LibcallRoutineNames[] = { +#define HANDLE_LIBCALL(code, name) name, +#include "llvm/IR/RuntimeLibcalls.def" +#undef HANDLE_LIBCALL +}; + namespace { const char *getExpectedProducerName() { @@ -226,7 +232,13 @@ setStr(Sym.IRName, GV->getName()); - if (Used.count(GV)) + bool IsBuiltinFunc = false; + + for (const char *LibcallName : LibcallRoutineNames) + if (GV->getName() == LibcallName) + IsBuiltinFunc = true; + + if (Used.count(GV) || IsBuiltinFunc) Sym.Flags |= 1 << storage::Symbol::FB_used; if (GV->isThreadLocal()) Sym.Flags |= 1 << storage::Symbol::FB_tls; Index: test/ThinLTO/X86/builtin-nostrip.ll =================================================================== --- test/ThinLTO/X86/builtin-nostrip.ll +++ test/ThinLTO/X86/builtin-nostrip.ll @@ -0,0 +1,59 @@ +; REQUIRES: x86-registered-target +; Compile with thinlto indices, to enable thinlto. +; RUN: opt -module-summary %s -o %t1.bc + +; Test old lto interface with thinlto (currently known to be broken, so +; the FileCheck line is commented out). +; FIXME: The new LTO implementation has been fixed to not internalize +; (and later dead-code-eliminate) builtin functions. However the old LTO +; implementation still internalizes them, and when used with ThinLTO they +; get dead-code eliminated before the optimizations run that insert calls +; to them (thus breaking these inserted calls). This needs to be fixed. +; RUN: llvm-lto -exported-symbol=main -thinlto-action=run %t1.bc +;;; RUN llvm-nm %t1.bc.thinlto.o | FileCheck %s --check-prefix=CHECK-NM + +; Test new lto interface with thinlto. +; RUN: llvm-lto2 run %t1.bc -o %t.out -save-temps \ +; RUN: -r %t1.bc,bar,pl \ +; RUN: -r %t1.bc,__stack_chk_fail,pl +; RUN: llvm-nm %t.out.1 | FileCheck %s --check-prefix=CHECK-NM +; + +; Re-compile, this time without the thinlto indices. +; RUN: opt %s -o %t4.bc + +; Test the new lto interface without thinlto. +; RUN: llvm-lto2 run %t4.bc -o %t5.out -save-temps \ +; RUN: -r %t4.bc,bar,pl \ +; RUN: -r %t4.bc,__stack_chk_fail,pl +; RUN: llvm-nm %t5.out.0 | FileCheck %s --check-prefix=CHECK-NM + +; Test the old lto interface without thinlto. For now we need to +; use a different nm check, because currently the old lto interface +; internalizes these symbols. Once the old lto interface gets +; fixed, we should be able to use the same CHECK-NM tests as the +; other FileChecks. +; RUN: llvm-lto -exported-symbol=main %t4.bc -o %t6 +; RUN: llvm-nm %t6 | FileCheck %s --check-prefix=CHECK-NM2 + +; The final binary should not contain any of the dead functions; +; make sure memmove and memcpy are there. +; CHECK-NM-NOT: bar +; CHECK-NM-DAG: T __stack_chk_fail +; CHECK-NM-NOT: bar + +; Test case for old lto without thinlto. Hopefully these can be +; eliminated once the old lto interface is fixed. +; CHECK-NM2-DAG: t __stack_chk_fail + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @bar() { + ret void +} + + +define void @__stack_chk_fail() { + ret void +}