amd: remove support for LLVM 3.9
[mesa.git] / src / amd / common / ac_llvm_util.c
index ee5fc89a2dfa92c9e96c52061873b56e3a215a5e..b88c4e4979f51fbc32d7e93d7fac570dd9015f85 100644 (file)
@@ -40,21 +40,22 @@ static void ac_init_llvm_target()
        LLVMInitializeAMDGPUTargetMC();
        LLVMInitializeAMDGPUAsmPrinter();
 
-       /*
-        * Workaround for bug in llvm 4.0 that causes image intrinsics
+       /* For inline assembly. */
+       LLVMInitializeAMDGPUAsmParser();
+
+       /* Workaround for bug in llvm 4.0 that causes image intrinsics
         * to disappear.
         * https://reviews.llvm.org/D26348
+        *
+        * "mesa" is the prefix for error messages.
         */
-#if HAVE_LLVM >= 0x0400
-       const char *argv[2] = {"mesa", "-simplifycfg-sink-common=false"};
+       const char *argv[2] = { "mesa", "-simplifycfg-sink-common=false" };
        LLVMParseCommandLineOptions(2, argv, NULL);
-#endif
-
 }
 
 static once_flag ac_init_llvm_target_once_flag = ONCE_FLAG_INIT;
 
-static LLVMTargetRef ac_get_llvm_target(const char *triple)
+LLVMTargetRef ac_get_llvm_target(const char *triple)
 {
        LLVMTargetRef target = NULL;
        char *err_message = NULL;
@@ -72,7 +73,7 @@ static LLVMTargetRef ac_get_llvm_target(const char *triple)
        return target;
 }
 
-static const char *ac_get_llvm_processor_name(enum radeon_family family)
+const char *ac_get_llvm_processor_name(enum radeon_family family)
 {
        switch (family) {
        case CHIP_TAHITI:
@@ -110,22 +111,33 @@ static const char *ac_get_llvm_processor_name(enum radeon_family family)
        case CHIP_POLARIS11:
        case CHIP_POLARIS12:
                return "polaris11";
+       case CHIP_VEGA10:
+       case CHIP_RAVEN:
+               return "gfx900";
        default:
                return "";
        }
 }
 
-LLVMTargetMachineRef ac_create_target_machine(enum radeon_family family, bool supports_spill)
+LLVMTargetMachineRef ac_create_target_machine(enum radeon_family family, enum ac_target_machine_options tm_options)
 {
        assert(family >= CHIP_TAHITI);
-
-       const char *triple = supports_spill ? "amdgcn-mesa-mesa3d" : "amdgcn--";
+       char features[256];
+       const char *triple = (tm_options & AC_TM_SUPPORTS_SPILL) ? "amdgcn-mesa-mesa3d" : "amdgcn--";
        LLVMTargetRef target = ac_get_llvm_target(triple);
+
+       snprintf(features, sizeof(features),
+                "+DumpCode,+vgpr-spilling,-fp32-denormals,+fp64-denormals%s%s%s%s",
+                tm_options & AC_TM_SISCHED ? ",+si-scheduler" : "",
+                tm_options & AC_TM_FORCE_ENABLE_XNACK ? ",+xnack" : "",
+                tm_options & AC_TM_FORCE_DISABLE_XNACK ? ",-xnack" : "",
+                tm_options & AC_TM_PROMOTE_ALLOCA_TO_SCRATCH ? ",-promote-alloca" : "");
+       
        LLVMTargetMachineRef tm = LLVMCreateTargetMachine(
                                     target,
                                     triple,
                                     ac_get_llvm_processor_name(family),
-                                    "+DumpCode,+vgpr-spilling,-fp32-denormals,-xnack",
+                                    features,
                                     LLVMCodeGenLevelDefault,
                                     LLVMRelocDefault,
                                     LLVMCodeModelDefault);
@@ -133,31 +145,10 @@ LLVMTargetMachineRef ac_create_target_machine(enum radeon_family family, bool su
        return tm;
 }
 
-
-#if HAVE_LLVM < 0x0400
-static LLVMAttribute ac_attr_to_llvm_attr(enum ac_func_attr attr)
-{
-   switch (attr) {
-   case AC_FUNC_ATTR_ALWAYSINLINE: return LLVMAlwaysInlineAttribute;
-   case AC_FUNC_ATTR_BYVAL: return LLVMByValAttribute;
-   case AC_FUNC_ATTR_INREG: return LLVMInRegAttribute;
-   case AC_FUNC_ATTR_NOALIAS: return LLVMNoAliasAttribute;
-   case AC_FUNC_ATTR_NOUNWIND: return LLVMNoUnwindAttribute;
-   case AC_FUNC_ATTR_READNONE: return LLVMReadNoneAttribute;
-   case AC_FUNC_ATTR_READONLY: return LLVMReadOnlyAttribute;
-   default:
-          fprintf(stderr, "Unhandled function attribute: %x\n", attr);
-          return 0;
-   }
-}
-
-#else
-
 static const char *attr_to_str(enum ac_func_attr attr)
 {
    switch (attr) {
    case AC_FUNC_ATTR_ALWAYSINLINE: return "alwaysinline";
-   case AC_FUNC_ATTR_BYVAL: return "byval";
    case AC_FUNC_ATTR_INREG: return "inreg";
    case AC_FUNC_ATTR_NOALIAS: return "noalias";
    case AC_FUNC_ATTR_NOUNWIND: return "nounwind";
@@ -172,20 +163,10 @@ static const char *attr_to_str(enum ac_func_attr attr)
    }
 }
 
-#endif
-
 void
 ac_add_function_attr(LLVMContextRef ctx, LLVMValueRef function,
                      int attr_idx, enum ac_func_attr attr)
 {
-#if HAVE_LLVM < 0x0400
-   LLVMAttribute llvm_attr = ac_attr_to_llvm_attr(attr);
-   if (attr_idx == -1) {
-      LLVMAddFunctionAttr(function, llvm_attr);
-   } else {
-      LLVMAddAttribute(LLVMGetParam(function, attr_idx - 1), llvm_attr);
-   }
-#else
    const char *attr_name = attr_to_str(attr);
    unsigned kind_id = LLVMGetEnumAttributeKindForName(attr_name,
                                                       strlen(attr_name));
@@ -195,7 +176,6 @@ ac_add_function_attr(LLVMContextRef ctx, LLVMValueRef function,
       LLVMAddAttributeAtIndex(function, attr_idx, llvm_attr);
    else
       LLVMAddCallSiteAttribute(function, attr_idx, llvm_attr);
-#endif
 }
 
 void ac_add_func_attributes(LLVMContextRef ctx, LLVMValueRef function,