You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
838 lines
34 KiB
838 lines
34 KiB
https://bugs.gentoo.org/630634
|
|
diff --git a/.gitignore b/.gitignore
|
|
index 9a883edfd..5f852d930 100644
|
|
--- a/.gitignore
|
|
+++ b/.gitignore
|
|
@@ -12,5 +12,6 @@ all_spec
|
|
/tmp
|
|
/doc/
|
|
/src/llvm/ext/llvm_ext.o
|
|
+/src/llvm/ext/llvm_ext.dwo
|
|
/src/ext/*.o
|
|
/src/ext/libcrystal.a
|
|
diff --git a/Makefile b/Makefile
|
|
index a5dc0d7e3..14a21bb86 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -37,8 +37,6 @@ LLVM_CONFIG_FINDER := \
|
|
(command -v llvm-config > /dev/null && (case "$(llvm-config --version)" in 3.9*) command -v llvm-config;; *) false;; esac)) || \
|
|
command -v llvm-config-3.8 || command -v llvm-config38 || \
|
|
(command -v llvm-config > /dev/null && (case "$(llvm-config --version)" in 3.8*) command -v llvm-config;; *) false;; esac)) || \
|
|
- command -v llvm-config-3.6 || command -v llvm-config36 || \
|
|
- command -v llvm-config-3.5 || command -v llvm-config35 || \
|
|
command -v llvm-config
|
|
LLVM_CONFIG := $(shell $(LLVM_CONFIG_FINDER))
|
|
LLVM_EXT_DIR = src/llvm/ext
|
|
diff --git a/src/compiler/crystal/compiler.cr b/src/compiler/crystal/compiler.cr
|
|
index a2bed9a95..afc7976e3 100644
|
|
--- a/src/compiler/crystal/compiler.cr
|
|
+++ b/src/compiler/crystal/compiler.cr
|
|
@@ -447,9 +447,6 @@ module Crystal
|
|
|
|
protected def optimize(llvm_mod)
|
|
fun_pass_manager = llvm_mod.new_function_pass_manager
|
|
- {% if LibLLVM::IS_35 || LibLLVM::IS_36 %}
|
|
- fun_pass_manager.add_target_data target_machine.data_layout
|
|
- {% end %}
|
|
pass_manager_builder.populate fun_pass_manager
|
|
fun_pass_manager.run llvm_mod
|
|
module_pass_manager.run llvm_mod
|
|
@@ -460,9 +457,6 @@ module Crystal
|
|
private def module_pass_manager
|
|
@module_pass_manager ||= begin
|
|
mod_pass_manager = LLVM::ModulePassManager.new
|
|
- {% if LibLLVM::IS_35 || LibLLVM::IS_36 %}
|
|
- mod_pass_manager.add_target_data target_machine.data_layout
|
|
- {% end %}
|
|
pass_manager_builder.populate mod_pass_manager
|
|
mod_pass_manager
|
|
end
|
|
@@ -554,54 +548,29 @@ module Crystal
|
|
can_reuse_previous_compilation =
|
|
!compiler.emit && !@bc_flags_changed && File.exists?(bc_name) && File.exists?(object_name)
|
|
|
|
- {% if LibLLVM::IS_35 %}
|
|
- # In LLVM 3.5 we can't write a bitcode to memory,
|
|
- # so instead we write it to another file
|
|
- bc_name_new = self.bc_name_new
|
|
- llvm_mod.write_bitcode_to_file(bc_name_new)
|
|
-
|
|
- if can_reuse_previous_compilation
|
|
- if FileUtils.cmp(bc_name, bc_name_new)
|
|
- # If the user cancelled a previous compilation it might be that
|
|
- # the .o file is empty
|
|
- if File.size(object_name) > 0
|
|
- File.delete bc_name_new
|
|
- must_compile = false
|
|
- end
|
|
- end
|
|
- end
|
|
+ memory_buffer = llvm_mod.write_bitcode_to_memory_buffer
|
|
|
|
- if must_compile
|
|
- # Create/overwrite the .bc file (for next compilations)
|
|
- File.rename(bc_name_new, bc_name)
|
|
- compiler.optimize llvm_mod if compiler.release?
|
|
- compiler.target_machine.emit_obj_to_file llvm_mod, object_name
|
|
- end
|
|
- {% else %}
|
|
- memory_buffer = llvm_mod.write_bitcode_to_memory_buffer
|
|
-
|
|
- if can_reuse_previous_compilation
|
|
- memory_io = IO::Memory.new(memory_buffer.to_slice)
|
|
- changed = File.open(bc_name) { |bc_file| !FileUtils.cmp(bc_file, memory_io) }
|
|
-
|
|
- # If the user cancelled a previous compilation
|
|
- # it might be that the .o file is empty
|
|
- if !changed && File.size(object_name) > 0
|
|
- must_compile = false
|
|
- memory_buffer.dispose
|
|
- memory_buffer = nil
|
|
- else
|
|
- # We need to compile, so we'll write the memory buffer to file
|
|
- end
|
|
- end
|
|
+ if can_reuse_previous_compilation
|
|
+ memory_io = IO::Memory.new(memory_buffer.to_slice)
|
|
+ changed = File.open(bc_name) { |bc_file| !FileUtils.cmp(bc_file, memory_io) }
|
|
|
|
- # If there's a memory buffer, it means we must create a .o from it
|
|
- if memory_buffer
|
|
- # Create the .bc file (for next compilations)
|
|
- File.write(bc_name, memory_buffer.to_slice)
|
|
+ # If the user cancelled a previous compilation
|
|
+ # it might be that the .o file is empty
|
|
+ if !changed && File.size(object_name) > 0
|
|
+ must_compile = false
|
|
memory_buffer.dispose
|
|
+ memory_buffer = nil
|
|
+ else
|
|
+ # We need to compile, so we'll write the memory buffer to file
|
|
end
|
|
- {% end %}
|
|
+ end
|
|
+
|
|
+ # If there's a memory buffer, it means we must create a .o from it
|
|
+ if memory_buffer
|
|
+ # Create the .bc file (for next compilations)
|
|
+ File.write(bc_name, memory_buffer.to_slice)
|
|
+ memory_buffer.dispose
|
|
+ end
|
|
|
|
if must_compile
|
|
compiler.optimize llvm_mod if compiler.release?
|
|
diff --git a/src/llvm.cr b/src/llvm.cr
|
|
index 44a03c272..f9b31cf4b 100644
|
|
--- a/src/llvm.cr
|
|
+++ b/src/llvm.cr
|
|
@@ -94,11 +94,5 @@ module LLVM
|
|
string
|
|
end
|
|
|
|
- {% if LibLLVM::IS_35 %}
|
|
- DEBUG_METADATA_VERSION = 1
|
|
- {% elsif LibLLVM::IS_36 %}
|
|
- DEBUG_METADATA_VERSION = 2
|
|
- {% else %}
|
|
- DEBUG_METADATA_VERSION = 3
|
|
- {% end %}
|
|
+ DEBUG_METADATA_VERSION = 3
|
|
end
|
|
diff --git a/src/llvm/context.cr b/src/llvm/context.cr
|
|
index 8485eedf1..7d66a4365 100644
|
|
--- a/src/llvm/context.cr
|
|
+++ b/src/llvm/context.cr
|
|
@@ -9,9 +9,9 @@ class LLVM::Context
|
|
end
|
|
|
|
def new_module(name : String) : Module
|
|
- {% if LibLLVM::IS_38 || LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
+ {% if LibLLVM::IS_38 %}
|
|
Module.new(LibLLVM.module_create_with_name_in_context(name, self), name, self)
|
|
- {% else %}
|
|
+ {% else %} # LLVM >= 3.9
|
|
Module.new(LibLLVM.module_create_with_name_in_context(name, self), self)
|
|
{% end %}
|
|
end
|
|
@@ -104,9 +104,9 @@ class LLVM::Context
|
|
if ret != 0 && msg
|
|
raise LLVM.string_and_dispose(msg)
|
|
end
|
|
- {% if LibLLVM::IS_38 || LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
+ {% if LibLLVM::IS_38 %}
|
|
Module.new(mod, "unknown", self)
|
|
- {% else %}
|
|
+ {% else %} # LLVM >= 3.9
|
|
Module.new(mod, self)
|
|
{% end %}
|
|
end
|
|
diff --git a/src/llvm/di_builder.cr b/src/llvm/di_builder.cr
|
|
index b8c0fd628..79571d2c0 100644
|
|
--- a/src/llvm/di_builder.cr
|
|
+++ b/src/llvm/di_builder.cr
|
|
@@ -31,16 +31,8 @@ struct LLVM::DIBuilder
|
|
|
|
def create_function(scope, name, linkage_name, file, line, composite_type, is_local_to_unit, is_definition,
|
|
scope_line, flags, is_optimized, func)
|
|
- {% if LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
- LibLLVMExt.di_builder_create_function(self, scope, name, linkage_name, file, line, composite_type,
|
|
- is_local_to_unit ? 1 : 0,
|
|
- is_definition ? 1 : 0,
|
|
- scope_line, flags,
|
|
- is_optimized ? 1 : 0, func)
|
|
- {% else %}
|
|
- LibLLVMExt.di_builder_create_function(self, scope, name, linkage_name, file, line, composite_type,
|
|
- is_local_to_unit, is_definition, scope_line, flags, is_optimized, func)
|
|
- {% end %}
|
|
+ LibLLVMExt.di_builder_create_function(self, scope, name, linkage_name, file, line, composite_type,
|
|
+ is_local_to_unit, is_definition, scope_line, flags, is_optimized, func)
|
|
end
|
|
|
|
def create_auto_variable(scope, name, file, line, type, align_in_bits)
|
|
@@ -87,19 +79,11 @@ struct LLVM::DIBuilder
|
|
end
|
|
|
|
def create_replaceable_composite_type(scope, name, file, line, context : Context)
|
|
- {% if LibLLVM::IS_35 || LibLLVM::IS_36 %}
|
|
- LibLLVMExt.temporary_md_node(context, nil, 0).as(LibLLVMExt::Metadata)
|
|
- {% else %}
|
|
- LibLLVMExt.di_builder_create_replaceable_composite_type(self, scope, name, file, line)
|
|
- {% end %}
|
|
+ LibLLVMExt.di_builder_create_replaceable_composite_type(self, scope, name, file, line)
|
|
end
|
|
|
|
def replace_temporary(from, to)
|
|
- {% if LibLLVM::IS_35 || LibLLVM::IS_36 %}
|
|
- LibLLVMExt.metadata_replace_all_uses_with(from, to)
|
|
- {% else %}
|
|
- LibLLVMExt.di_builder_replace_temporary(self, from, to)
|
|
- {% end %}
|
|
+ LibLLVMExt.di_builder_replace_temporary(self, from, to)
|
|
end
|
|
|
|
def end
|
|
diff --git a/src/llvm/ext/llvm_ext.cc b/src/llvm/ext/llvm_ext.cc
|
|
index d13446160..3dbdd4220 100644
|
|
--- a/src/llvm/ext/llvm_ext.cc
|
|
+++ b/src/llvm/ext/llvm_ext.cc
|
|
@@ -18,35 +18,22 @@ using namespace llvm;
|
|
#define LLVM_VERSION_LE(major, minor) \
|
|
(LLVM_VERSION_MAJOR < (major) || LLVM_VERSION_MAJOR == (major) && LLVM_VERSION_MINOR <= (minor))
|
|
|
|
+#if LLVM_VERSION_LE(4, 0)
|
|
typedef struct LLVMOpaqueDIBuilder *LLVMDIBuilderRef;
|
|
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DIBuilder, LLVMDIBuilderRef)
|
|
|
|
-#if LLVM_VERSION_EQ(3, 5)
|
|
-typedef LLVMValueRef LLVMMetadataRef;
|
|
-typedef Value Metadata;
|
|
-#define DIBuilderRef LLVMDIBuilderRef
|
|
-
|
|
-#else /* LLVM != 3.5 */
|
|
typedef struct LLVMOpaqueMetadata *LLVMMetadataRef;
|
|
DEFINE_ISA_CONVERSION_FUNCTIONS(Metadata, LLVMMetadataRef)
|
|
inline Metadata **unwrap(LLVMMetadataRef *Vals) {
|
|
return reinterpret_cast<Metadata **>(Vals);
|
|
}
|
|
-#endif /* LLVM == 3.5 */
|
|
-
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
-template <typename T> T unwrapDIptr(LLVMMetadataRef v) {
|
|
- return v ? T(unwrap<MDNode>(v)) : T();
|
|
-}
|
|
-#define DIBuilderRef LLVMDIBuilderRef
|
|
+#endif
|
|
|
|
-#else /* LLVM > 3.6 */
|
|
typedef DIBuilder *DIBuilderRef;
|
|
#define DIArray DINodeArray
|
|
template <typename T> T *unwrapDIptr(LLVMMetadataRef v) {
|
|
return (T *)(v ? unwrap<MDNode>(v) : NULL);
|
|
}
|
|
-#endif /* LLVM <= 3.6 */
|
|
|
|
#if LLVM_VERSION_LE(3, 6)
|
|
#define OperandBundleDef void
|
|
@@ -66,13 +53,7 @@ void LLVMDIBuilderFinalize(LLVMDIBuilderRef dref) { unwrap(dref)->finalize(); }
|
|
|
|
LLVMMetadataRef LLVMDIBuilderCreateFile(DIBuilderRef Dref, const char *File,
|
|
const char *Dir) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DIFile F = D->createFile(File, Dir);
|
|
- return wrap(F);
|
|
-#else
|
|
return wrap(Dref->createFile(File, Dir));
|
|
-#endif
|
|
}
|
|
|
|
LLVMMetadataRef LLVMDIBuilderCreateCompileUnit(DIBuilderRef Dref, unsigned Lang,
|
|
@@ -82,20 +63,13 @@ LLVMMetadataRef LLVMDIBuilderCreateCompileUnit(DIBuilderRef Dref, unsigned Lang,
|
|
int Optimized,
|
|
const char *Flags,
|
|
unsigned RuntimeVersion) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DICompileUnit CU = D->createCompileUnit(Lang, File, Dir, Producer, Optimized,
|
|
- Flags, RuntimeVersion);
|
|
- return wrap(CU);
|
|
-#else
|
|
-# if LLVM_VERSION_LE(3, 9)
|
|
+#if LLVM_VERSION_LE(3, 9)
|
|
return wrap(Dref->createCompileUnit(Lang, File, Dir, Producer, Optimized,
|
|
Flags, RuntimeVersion));
|
|
-# else
|
|
+#else
|
|
DIFile *F = Dref->createFile(File, Dir);
|
|
return wrap(Dref->createCompileUnit(Lang, F, Producer, Optimized,
|
|
Flags, RuntimeVersion));
|
|
-# endif
|
|
#endif
|
|
}
|
|
|
|
@@ -111,19 +85,11 @@ LLVMMetadataRef LLVMDIBuilderCreateFunction(
|
|
#endif
|
|
bool IsOptimized,
|
|
LLVMValueRef Func) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DISubprogram Sub = D->createFunction(
|
|
- unwrapDI<DIDescriptor>(Scope), Name, LinkageName, unwrapDI<DIFile>(File),
|
|
- Line, unwrapDI<DICompositeType>(CompositeType), IsLocalToUnit,
|
|
- IsDefinition, ScopeLine, Flags, IsOptimized, unwrap<Function>(Func));
|
|
-#else
|
|
DISubprogram *Sub = Dref->createFunction(
|
|
unwrapDI<DIScope>(Scope), Name, LinkageName, unwrapDI<DIFile>(File), Line,
|
|
unwrapDI<DISubroutineType>(CompositeType), IsLocalToUnit, IsDefinition,
|
|
ScopeLine, Flags, IsOptimized);
|
|
unwrap<Function>(Func)->setSubprogram(Sub);
|
|
-#endif
|
|
return wrap(Sub);
|
|
}
|
|
|
|
@@ -132,18 +98,8 @@ LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock(DIBuilderRef Dref,
|
|
LLVMMetadataRef File,
|
|
unsigned Line,
|
|
unsigned Column) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
-# if LLVM_VERSION_EQ(3, 5)
|
|
- DILexicalBlock LB = D->createLexicalBlock(unwrapDI<DIDescriptor>(Scope), unwrapDI<DIFile>(File), Line, Column, 0);
|
|
-# else /* LLVM <= 3.6 && LLVM != 3.5 */
|
|
- DILexicalBlock LB = D->createLexicalBlock(unwrapDI<DIDescriptor>(Scope), unwrapDI<DIFile>(File), Line, Column);
|
|
-# endif
|
|
- return wrap(LB);
|
|
-#else /* LLVM > 3.6 */
|
|
return wrap(Dref->createLexicalBlock(unwrapDI<DIDescriptor>(Scope),
|
|
unwrapDI<DIFile>(File), Line, Column));
|
|
-#endif /* LLVM <= 3.6 */
|
|
}
|
|
|
|
LLVMMetadataRef LLVMDIBuilderCreateBasicType(DIBuilderRef Dref,
|
|
@@ -151,71 +107,34 @@ LLVMMetadataRef LLVMDIBuilderCreateBasicType(DIBuilderRef Dref,
|
|
uint64_t SizeInBits,
|
|
uint64_t AlignInBits,
|
|
unsigned Encoding) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DIBasicType T = D->createBasicType(Name, SizeInBits, AlignInBits, Encoding);
|
|
- return wrap(T);
|
|
-#else
|
|
-# if LLVM_VERSION_LE(3, 9)
|
|
+#if LLVM_VERSION_LE(3, 9)
|
|
return wrap(Dref->createBasicType(Name, SizeInBits, AlignInBits, Encoding));
|
|
-# else
|
|
+#else
|
|
return wrap(Dref->createBasicType(Name, SizeInBits, Encoding));
|
|
-# endif
|
|
#endif
|
|
}
|
|
|
|
LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(DIBuilderRef Dref,
|
|
LLVMMetadataRef *Data,
|
|
unsigned Length) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
-# if LLVM_VERSION_EQ(3, 5)
|
|
- Value **DataValue = unwrap(Data);
|
|
- ArrayRef<Value *> Elements(DataValue, Length);
|
|
- DIArray A = D->getOrCreateArray(Elements);
|
|
-# else /* LLVM <= 3.6 && LLVM != 3.5 */
|
|
- Metadata **DataValue = unwrap(Data);
|
|
- ArrayRef<Metadata *> Elements(DataValue, Length);
|
|
- DITypeArray A = D->getOrCreateTypeArray(Elements);
|
|
-# endif
|
|
- return wrap(A);
|
|
-#else /* LLVM > 3.6 */
|
|
Metadata **DataValue = unwrap(Data);
|
|
return wrap(
|
|
Dref->getOrCreateTypeArray(ArrayRef<Metadata *>(DataValue, Length))
|
|
.get());
|
|
-#endif /* LLVM <= 3.6 */
|
|
}
|
|
|
|
LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(DIBuilderRef Dref,
|
|
LLVMMetadataRef *Data,
|
|
unsigned Length) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- ArrayRef<Metadata *> elements(unwrap(Data), Length);
|
|
- DIArray a = D->getOrCreateArray(elements);
|
|
-
|
|
- return wrap(a);
|
|
-#else
|
|
Metadata **DataValue = unwrap(Data);
|
|
return wrap(
|
|
Dref->getOrCreateArray(ArrayRef<Metadata *>(DataValue, Length)).get());
|
|
-#endif
|
|
}
|
|
|
|
LLVMMetadataRef
|
|
LLVMDIBuilderCreateSubroutineType(DIBuilderRef Dref, LLVMMetadataRef File,
|
|
LLVMMetadataRef ParameterTypes) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
-# if LLVM_VERSION_EQ(3, 5)
|
|
- DICompositeType CT = D->createSubroutineType(unwrapDI<DIFile>(File), unwrapDI<DIArray>(ParameterTypes));
|
|
-# else /* LLVM <= 3.6 && LLVM != 3.5 */
|
|
- DICompositeType CT = D->createSubroutineType(unwrapDI<DIFile>(File), unwrapDI<DITypeArray>(ParameterTypes));
|
|
-# endif
|
|
-#else /* LLVM > 3.6 */
|
|
DISubroutineType *CT = Dref->createSubroutineType(DITypeRefArray(unwrap<MDTuple>(ParameterTypes)));
|
|
-#endif /* LLVM <= 3.6 */
|
|
return wrap(CT);
|
|
}
|
|
|
|
@@ -229,21 +148,14 @@ LLVMMetadataRef LLVMDIBuilderCreateAutoVariable(
|
|
DINode::DIFlags Flags,
|
|
#endif
|
|
uint32_t AlignInBits) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DIVariable V = D->createLocalVariable(
|
|
- llvm::dwarf::DW_TAG_auto_variable, unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line,
|
|
- unwrapDI<DIType>(Ty), AlwaysPreserve, Flags, 0);
|
|
-#else
|
|
-# if LLVM_VERSION_LE(3, 9)
|
|
+#if LLVM_VERSION_LE(3, 9)
|
|
DILocalVariable *V = Dref->createAutoVariable(
|
|
unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line,
|
|
unwrapDI<DIType>(Ty), AlwaysPreserve, Flags);
|
|
-# else
|
|
+#else
|
|
DILocalVariable *V = Dref->createAutoVariable(
|
|
unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line,
|
|
unwrapDI<DIType>(Ty), AlwaysPreserve, Flags, AlignInBits);
|
|
-# endif
|
|
#endif
|
|
return wrap(V);
|
|
}
|
|
@@ -258,18 +170,10 @@ LLVMMetadataRef LLVMDIBuilderCreateParameterVariable(
|
|
DINode::DIFlags Flags
|
|
#endif
|
|
) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DIVariable V = D->createLocalVariable(
|
|
- llvm::dwarf::DW_TAG_arg_variable, unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line,
|
|
- unwrapDI<DIType>(Ty), AlwaysPreserve, Flags, ArgNo);
|
|
- return wrap(V);
|
|
-#else
|
|
DILocalVariable *V = Dref->createParameterVariable
|
|
(unwrapDI<DIDescriptor>(Scope), Name, ArgNo, unwrapDI<DIFile>(File), Line,
|
|
unwrapDI<DIType>(Ty), AlwaysPreserve, Flags);
|
|
return wrap(V);
|
|
-#endif
|
|
}
|
|
|
|
LLVMValueRef LLVMDIBuilderInsertDeclareAtEnd(DIBuilderRef Dref,
|
|
@@ -278,46 +182,17 @@ LLVMValueRef LLVMDIBuilderInsertDeclareAtEnd(DIBuilderRef Dref,
|
|
LLVMMetadataRef Expr,
|
|
LLVMValueRef DL,
|
|
LLVMBasicBlockRef Block) {
|
|
-#if LLVM_VERSION_EQ(3, 5)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- Instruction *Instr =
|
|
- D->insertDeclare(unwrap(Storage), unwrapDI<DIVariable>(VarInfo),
|
|
- unwrap(Block));
|
|
- Instr->setDebugLoc(DebugLoc::getFromDILocation(cast<MDNode>(DL)));
|
|
-#endif
|
|
-
|
|
-#if LLVM_VERSION_EQ(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- Instruction *Instr =
|
|
- D->insertDeclare(unwrap(Storage), unwrapDI<DIVariable>(VarInfo),
|
|
- unwrapDI<DIExpression>(Expr), unwrap(Block));
|
|
- Instr->setDebugLoc(DebugLoc::getFromDILocation(cast<MDNode>(unwrap<MetadataAsValue>(DL)->getMetadata())));
|
|
-#endif
|
|
-
|
|
-#if LLVM_VERSION_GE(3, 7)
|
|
Instruction *Instr =
|
|
Dref->insertDeclare(unwrap(Storage), unwrap<DILocalVariable>(VarInfo),
|
|
unwrapDI<DIExpression>(Expr),
|
|
DebugLoc(cast<MDNode>(unwrap<MetadataAsValue>(DL)->getMetadata())),
|
|
unwrap(Block));
|
|
-#endif
|
|
-
|
|
return wrap(Instr);
|
|
}
|
|
|
|
LLVMMetadataRef LLVMDIBuilderCreateExpression(DIBuilderRef Dref, int64_t *Addr,
|
|
size_t Length) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
-# if LLVM_VERSION_EQ(3, 5)
|
|
- return nullptr;
|
|
-# else /* LLVM <= 3.6 && LLVM != 3.5 */
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DIExpression Expr = D->createExpression(ArrayRef<int64_t>(Addr, Length));
|
|
- return wrap(Expr);
|
|
-# endif
|
|
-#else /* LLVM > 3.6 */
|
|
return wrap(Dref->createExpression(ArrayRef<int64_t>(Addr, Length)));
|
|
-#endif
|
|
}
|
|
|
|
LLVMMetadataRef LLVMDIBuilderCreateEnumerationType(
|
|
@@ -325,30 +200,16 @@ LLVMMetadataRef LLVMDIBuilderCreateEnumerationType(
|
|
LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits,
|
|
uint64_t AlignInBits, LLVMMetadataRef Elements,
|
|
LLVMMetadataRef UnderlyingType) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DICompositeType enumType = D->createEnumerationType(
|
|
- unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), LineNumber,
|
|
- SizeInBits, AlignInBits, unwrapDI<DIArray>(Elements),
|
|
- unwrapDI<DIType>(UnderlyingType));
|
|
-#else
|
|
DICompositeType *enumType = Dref->createEnumerationType(
|
|
unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), LineNumber,
|
|
SizeInBits, AlignInBits, DINodeArray(unwrapDI<MDTuple>(Elements)),
|
|
unwrapDI<DIType>(UnderlyingType));
|
|
-#endif
|
|
return wrap(enumType);
|
|
}
|
|
|
|
LLVMMetadataRef LLVMDIBuilderCreateEnumerator(DIBuilderRef Dref,
|
|
const char *Name, int64_t Value) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DIEnumerator e = D->createEnumerator(Name, Value);
|
|
- return wrap(e);
|
|
-#else
|
|
DIEnumerator *e = Dref->createEnumerator(Name, Value);
|
|
-#endif
|
|
return wrap(e);
|
|
}
|
|
|
|
@@ -367,22 +228,13 @@ LLVMDIBuilderCreateStructType(DIBuilderRef Dref,
|
|
#endif
|
|
LLVMMetadataRef DerivedFrom,
|
|
LLVMMetadataRef Elements) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DICompositeType CT = D->createStructType(
|
|
- unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line,
|
|
- SizeInBits, AlignInBits, Flags, unwrapDI<DIType>(DerivedFrom),
|
|
- unwrapDI<DIArray>(Elements));
|
|
-#else
|
|
DICompositeType *CT = Dref->createStructType(
|
|
unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line,
|
|
SizeInBits, AlignInBits, Flags, unwrapDI<DIType>(DerivedFrom),
|
|
DINodeArray(unwrapDI<MDTuple>(Elements)));
|
|
-#endif
|
|
return wrap(CT);
|
|
}
|
|
|
|
-#if LLVM_VERSION_GE(3, 8)
|
|
LLVMMetadataRef
|
|
LLVMDIBuilderCreateReplaceableCompositeType(DIBuilderRef Dref,
|
|
LLVMMetadataRef Scope,
|
|
@@ -409,7 +261,6 @@ LLVMDIBuilderReplaceTemporary(DIBuilderRef Dref,
|
|
llvm::TempMDNode fwd_decl(Node);
|
|
Dref->replaceTemporary(std::move(fwd_decl), Type);
|
|
}
|
|
-#endif
|
|
|
|
LLVMMetadataRef
|
|
LLVMDIBuilderCreateMemberType(DIBuilderRef Dref, LLVMMetadataRef Scope,
|
|
@@ -422,16 +273,9 @@ LLVMDIBuilderCreateMemberType(DIBuilderRef Dref, LLVMMetadataRef Scope,
|
|
DINode::DIFlags Flags,
|
|
#endif
|
|
LLVMMetadataRef Ty) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DIDerivedType DT = D->createMemberType(
|
|
- unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line,
|
|
- SizeInBits, AlignInBits, OffsetInBits, Flags, unwrapDI<DIType>(Ty));
|
|
-#else
|
|
DIDerivedType *DT = Dref->createMemberType(
|
|
unwrapDI<DIDescriptor>(Scope), Name, unwrapDI<DIFile>(File), Line,
|
|
SizeInBits, AlignInBits, OffsetInBits, Flags, unwrapDI<DIType>(Ty));
|
|
-#endif
|
|
return wrap(DT);
|
|
}
|
|
|
|
@@ -440,39 +284,24 @@ LLVMMetadataRef LLVMDIBuilderCreatePointerType(DIBuilderRef Dref,
|
|
uint64_t SizeInBits,
|
|
uint64_t AlignInBits,
|
|
const char *Name) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- DIBuilder *D = unwrap(Dref);
|
|
- DIDerivedType T = D->createPointerType(unwrapDI<DIType>(PointeeType),
|
|
- SizeInBits, AlignInBits, Name);
|
|
-#else
|
|
DIDerivedType *T = Dref->createPointerType(unwrapDI<DIType>(PointeeType),
|
|
- SizeInBits, AlignInBits, Name);
|
|
+ SizeInBits, AlignInBits,
|
|
+#if LLVM_VERSION_GE(5, 0)
|
|
+ None,
|
|
#endif
|
|
+ Name);
|
|
return wrap(T);
|
|
}
|
|
|
|
LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs,
|
|
unsigned Count) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
- return wrap(MDNode::getTemporary(*unwrap(C),
|
|
- ArrayRef<Metadata *>(unwrap(MDs), Count)));
|
|
-#else
|
|
return wrap(MDTuple::getTemporary(*unwrap(C),
|
|
ArrayRef<Metadata *>(unwrap(MDs), Count))
|
|
.release());
|
|
-#endif
|
|
}
|
|
|
|
void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New) {
|
|
-#if LLVM_VERSION_LE(3, 6)
|
|
-# if LLVM_VERSION_EQ(3, 5)
|
|
auto *Node = unwrap<MDNode>(MD);
|
|
-# else /* LLVM <= 3.6 && LLVM != 3.5 */
|
|
- auto *Node = unwrap<MDNodeFwdDecl>(MD);
|
|
-# endif
|
|
-#else /* LLVM > 3.6 */
|
|
- auto *Node = unwrap<MDNode>(MD);
|
|
-#endif
|
|
Node->replaceAllUsesWith(unwrap<MDNode>(New));
|
|
MDNode::deleteTemporary(Node);
|
|
}
|
|
diff --git a/src/llvm/function_pass_manager.cr b/src/llvm/function_pass_manager.cr
|
|
index 979cb9c97..834d72a20 100644
|
|
--- a/src/llvm/function_pass_manager.cr
|
|
+++ b/src/llvm/function_pass_manager.cr
|
|
@@ -2,12 +2,6 @@ class LLVM::FunctionPassManager
|
|
def initialize(@unwrap : LibLLVM::PassManagerRef)
|
|
end
|
|
|
|
- {% if LibLLVM::IS_35 || LibLLVM::IS_36 %}
|
|
- def add_target_data(target_data)
|
|
- LibLLVM.add_target_data target_data, self
|
|
- end
|
|
- {% end %}
|
|
-
|
|
def run(mod : Module)
|
|
changed = false
|
|
run do |runner|
|
|
diff --git a/src/llvm/lib_llvm.cr b/src/llvm/lib_llvm.cr
|
|
index e2c7a9445..5a0b67cdd 100644
|
|
--- a/src/llvm/lib_llvm.cr
|
|
+++ b/src/llvm/lib_llvm.cr
|
|
@@ -6,8 +6,6 @@ lib LibLLVM
|
|
(command -v llvm-config > /dev/null && (case "$(llvm-config --version)" in 3.9*) command -v llvm-config;; *) false;; esac)) || \
|
|
command -v llvm-config-3.8 || command -v llvm-config38 || \
|
|
(command -v llvm-config > /dev/null && (case "$(llvm-config --version)" in 3.8*) command -v llvm-config;; *) false;; esac)) || \
|
|
- command -v llvm-config-3.6 || command -v llvm-config36 || \
|
|
- command -v llvm-config-3.5 || command -v llvm-config35 || \
|
|
command -v llvm-config
|
|
`.chomp.stringify
|
|
}}
|
|
@@ -32,8 +30,6 @@ end
|
|
IS_40 = {{LibLLVM::VERSION.starts_with?("4.0")}}
|
|
IS_39 = {{LibLLVM::VERSION.starts_with?("3.9")}}
|
|
IS_38 = {{LibLLVM::VERSION.starts_with?("3.8")}}
|
|
- IS_36 = {{LibLLVM::VERSION.starts_with?("3.6")}}
|
|
- IS_35 = {{LibLLVM::VERSION.starts_with?("3.5")}}
|
|
end
|
|
{% end %}
|
|
|
|
@@ -283,9 +279,7 @@ lib LibLLVM
|
|
fun set_alignment = LLVMSetAlignment(value : ValueRef, bytes : UInt32)
|
|
fun get_return_type = LLVMGetReturnType(TypeRef) : TypeRef
|
|
|
|
- {% unless LibLLVM::IS_35 %}
|
|
- fun write_bitcode_to_memory_buffer = LLVMWriteBitcodeToMemoryBuffer(mod : ModuleRef) : MemoryBufferRef
|
|
- {% end %}
|
|
+ fun write_bitcode_to_memory_buffer = LLVMWriteBitcodeToMemoryBuffer(mod : ModuleRef) : MemoryBufferRef
|
|
|
|
fun dispose_memory_buffer = LLVMDisposeMemoryBuffer(buf : MemoryBufferRef) : Void
|
|
fun get_buffer_start = LLVMGetBufferStart(buf : MemoryBufferRef) : UInt8*
|
|
@@ -293,26 +287,22 @@ lib LibLLVM
|
|
|
|
fun write_bitcode_to_fd = LLVMWriteBitcodeToFD(mod : ModuleRef, fd : LibC::Int, should_close : LibC::Int, unbuffered : LibC::Int) : LibC::Int
|
|
|
|
- {% if LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
- fun add_target_data = LLVMAddTargetData(td : TargetDataRef, pm : PassManagerRef)
|
|
- {% end %}
|
|
-
|
|
- {% if LibLLVM::IS_38 || LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
+ {% if LibLLVM::IS_38 %}
|
|
fun copy_string_rep_of_target_data = LLVMCopyStringRepOfTargetData(data : TargetDataRef) : UInt8*
|
|
fun get_target_machine_data = LLVMGetTargetMachineData(t : TargetMachineRef) : TargetDataRef
|
|
fun set_data_layout = LLVMSetDataLayout(mod : ModuleRef, data : UInt8*)
|
|
- {% else %}
|
|
+ {% else %} # LLVM >= 3.9
|
|
fun create_target_data_layout = LLVMCreateTargetDataLayout(t : TargetMachineRef) : TargetDataRef
|
|
fun set_module_data_layout = LLVMSetModuleDataLayout(mod : ModuleRef, data : TargetDataRef)
|
|
{% end %}
|
|
|
|
- {% if LibLLVM::IS_38 || LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
+ {% if LibLLVM::IS_38 %}
|
|
fun add_attribute = LLVMAddAttribute(arg : ValueRef, attr : LLVM::Attribute)
|
|
fun add_instr_attribute = LLVMAddInstrAttribute(instr : ValueRef, index : UInt32, attr : LLVM::Attribute)
|
|
fun add_function_attr = LLVMAddFunctionAttr(fn : ValueRef, pa : LLVM::Attribute)
|
|
fun get_function_attr = LLVMGetFunctionAttr(fn : ValueRef) : LLVM::Attribute
|
|
fun get_attribute = LLVMGetAttribute(arg : ValueRef) : LLVM::Attribute
|
|
- {% else %}
|
|
+ {% else %} # LLVM >= 3.9
|
|
type AttributeRef = Void*
|
|
alias AttributeIndex = UInt
|
|
|
|
diff --git a/src/llvm/lib_llvm_ext.cr b/src/llvm/lib_llvm_ext.cr
|
|
index 84c65cccb..953567eb8 100644
|
|
--- a/src/llvm/lib_llvm_ext.cr
|
|
+++ b/src/llvm/lib_llvm_ext.cr
|
|
@@ -13,19 +13,11 @@ lib LibLLVMExt
|
|
fun create_di_builder = LLVMNewDIBuilder(LibLLVM::ModuleRef) : DIBuilder
|
|
fun di_builder_finalize = LLVMDIBuilderFinalize(DIBuilder)
|
|
|
|
- {% if LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
- fun di_builder_create_function = LLVMDIBuilderCreateFunction(
|
|
- builder : DIBuilder, scope : Metadata, name : Char*,
|
|
- linkage_name : Char*, file : Metadata, line : UInt,
|
|
- composite_type : Metadata, is_local_to_unit : Int, is_definition : Int,
|
|
- scope_line : UInt, flags : LLVM::DIFlags, is_optimized : Int, func : LibLLVM::ValueRef) : Metadata
|
|
- {% else %}
|
|
- fun di_builder_create_function = LLVMDIBuilderCreateFunction(
|
|
- builder : DIBuilder, scope : Metadata, name : Char*,
|
|
- linkage_name : Char*, file : Metadata, line : UInt,
|
|
- composite_type : Metadata, is_local_to_unit : Bool, is_definition : Bool,
|
|
- scope_line : UInt, flags : LLVM::DIFlags, is_optimized : Bool, func : LibLLVM::ValueRef) : Metadata
|
|
- {% end %}
|
|
+ fun di_builder_create_function = LLVMDIBuilderCreateFunction(
|
|
+ builder : DIBuilder, scope : Metadata, name : Char*,
|
|
+ linkage_name : Char*, file : Metadata, line : UInt,
|
|
+ composite_type : Metadata, is_local_to_unit : Bool, is_definition : Bool,
|
|
+ scope_line : UInt, flags : LLVM::DIFlags, is_optimized : Bool, func : LibLLVM::ValueRef) : Metadata
|
|
|
|
fun di_builder_create_file = LLVMDIBuilderCreateFile(builder : DIBuilder, file : Char*, dir : Char*) : Metadata
|
|
fun di_builder_create_compile_unit = LLVMDIBuilderCreateCompileUnit(builder : DIBuilder,
|
|
@@ -94,17 +86,12 @@ lib LibLLVMExt
|
|
align_in_bits : UInt64,
|
|
name : Char*) : Metadata
|
|
|
|
- {% if LibLLVM::IS_35 || LibLLVM::IS_36 %}
|
|
- fun temporary_md_node = LLVMTemporaryMDNode(context : LibLLVM::ContextRef, mds : Metadata*, count : UInt) : Metadata
|
|
- fun metadata_replace_all_uses_with = LLVMMetadataReplaceAllUsesWith(Metadata, Metadata)
|
|
- {% else %}
|
|
- fun di_builder_create_replaceable_composite_type = LLVMDIBuilderCreateReplaceableCompositeType(builder : DIBuilder,
|
|
- scope : Metadata,
|
|
- name : Char*,
|
|
- file : Metadata,
|
|
- line : UInt) : Metadata
|
|
- fun di_builder_replace_temporary = LLVMDIBuilderReplaceTemporary(builder : DIBuilder, from : Metadata, to : Metadata)
|
|
- {% end %}
|
|
+ fun di_builder_create_replaceable_composite_type = LLVMDIBuilderCreateReplaceableCompositeType(builder : DIBuilder,
|
|
+ scope : Metadata,
|
|
+ name : Char*,
|
|
+ file : Metadata,
|
|
+ line : UInt) : Metadata
|
|
+ fun di_builder_replace_temporary = LLVMDIBuilderReplaceTemporary(builder : DIBuilder, from : Metadata, to : Metadata)
|
|
|
|
fun set_current_debug_location = LLVMSetCurrentDebugLocation2(LibLLVM::BuilderRef, Int, Int, Metadata, Metadata)
|
|
|
|
diff --git a/src/llvm/module.cr b/src/llvm/module.cr
|
|
index cb71e3b21..c15a56e77 100644
|
|
--- a/src/llvm/module.cr
|
|
+++ b/src/llvm/module.cr
|
|
@@ -6,7 +6,7 @@ class LLVM::Module
|
|
|
|
getter context : Context
|
|
|
|
- {% if LibLLVM::IS_38 || LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
+ {% if LibLLVM::IS_38 %}
|
|
def initialize(@unwrap : LibLLVM::ModuleRef, @name : String, @context : Context)
|
|
@owned = false
|
|
end
|
|
@@ -14,7 +14,7 @@ class LLVM::Module
|
|
def name : String
|
|
@name
|
|
end
|
|
- {% else %}
|
|
+ {% else %} # LLVM >= 3.9
|
|
def initialize(@unwrap : LibLLVM::ModuleRef, @context : Context)
|
|
@owned = false
|
|
end
|
|
@@ -34,9 +34,9 @@ class LLVM::Module
|
|
end
|
|
|
|
def data_layout=(data : TargetData)
|
|
- {% if LibLLVM::IS_38 || LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
+ {% if LibLLVM::IS_38 %}
|
|
LibLLVM.set_data_layout(self, data.to_data_layout_string)
|
|
- {% else %}
|
|
+ {% else %} # LLVM >= 3.9
|
|
LibLLVM.set_module_data_layout(self, data)
|
|
{% end %}
|
|
end
|
|
@@ -57,11 +57,9 @@ class LLVM::Module
|
|
LibLLVM.write_bitcode_to_file self, filename
|
|
end
|
|
|
|
- {% unless LibLLVM::IS_35 %}
|
|
- def write_bitcode_to_memory_buffer
|
|
- MemoryBuffer.new(LibLLVM.write_bitcode_to_memory_buffer self)
|
|
- end
|
|
- {% end %}
|
|
+ def write_bitcode_to_memory_buffer
|
|
+ MemoryBuffer.new(LibLLVM.write_bitcode_to_memory_buffer self)
|
|
+ end
|
|
|
|
def write_bitcode_to_fd(fd : Int, should_close = false, buffered = false)
|
|
LibLLVM.write_bitcode_to_fd(self, fd, should_close ? 1 : 0, buffered ? 1 : 0)
|
|
diff --git a/src/llvm/module_pass_manager.cr b/src/llvm/module_pass_manager.cr
|
|
index 10bfa60bd..519227809 100644
|
|
--- a/src/llvm/module_pass_manager.cr
|
|
+++ b/src/llvm/module_pass_manager.cr
|
|
@@ -3,12 +3,6 @@ class LLVM::ModulePassManager
|
|
@unwrap = LibLLVM.pass_manager_create
|
|
end
|
|
|
|
- {% if LibLLVM::IS_35 || LibLLVM::IS_36 %}
|
|
- def add_target_data(target_data)
|
|
- LibLLVM.add_target_data target_data, self
|
|
- end
|
|
- {% end %}
|
|
-
|
|
def run(mod)
|
|
LibLLVM.run_pass_manager(self, mod) != 0
|
|
end
|
|
diff --git a/src/llvm/target_machine.cr b/src/llvm/target_machine.cr
|
|
index e4bb081e9..42e44abe2 100644
|
|
--- a/src/llvm/target_machine.cr
|
|
+++ b/src/llvm/target_machine.cr
|
|
@@ -9,9 +9,9 @@ class LLVM::TargetMachine
|
|
|
|
def data_layout
|
|
@layout ||= begin
|
|
- layout = {% if LibLLVM::IS_38 || LibLLVM::IS_36 || LibLLVM::IS_35 %}
|
|
+ layout = {% if LibLLVM::IS_38 %}
|
|
LibLLVM.get_target_machine_data(self)
|
|
- {% else %}
|
|
+ {% else %} # LLVM >= 3.9
|
|
LibLLVM.create_target_data_layout(self)
|
|
{% end %}
|
|
layout ? TargetData.new(layout) : raise "Missing layout for #{self}"
|
|
--
|
|
2.14.1
|
|
|