diff --git a/Xcode/LLVM.xcodeproj/project.pbxproj b/Xcode/LLVM.xcodeproj/project.pbxproj index 97f73286617..24939d9b7de 100644 --- a/Xcode/LLVM.xcodeproj/project.pbxproj +++ b/Xcode/LLVM.xcodeproj/project.pbxproj @@ -142,6 +142,9 @@ 9F7C240C0CB81ECD00498408 /* analysis_ocaml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = analysis_ocaml.c; sourceTree = ""; }; 9F7C240D0CB81ECD00498408 /* llvm_analysis.ml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = llvm_analysis.ml; sourceTree = ""; }; 9F7C240E0CB81ECD00498408 /* llvm_analysis.mli */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = llvm_analysis.mli; sourceTree = ""; }; + 9F7C2C4F0CB9496C00498408 /* analysis.ml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = analysis.ml; sourceTree = ""; }; + 9F7C2C520CB9496C00498408 /* bitwriter.ml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bitwriter.ml; sourceTree = ""; }; + 9F7C2C5D0CB9496C00498408 /* vmcore.ml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vmcore.ml; sourceTree = ""; }; 9FA638D90C77B184007F12AE /* AutoUpgrade.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AutoUpgrade.h; sourceTree = ""; }; 9FA638DA0C77B184007F12AE /* GlobalAlias.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = GlobalAlias.h; sourceTree = ""; }; 9FA638DB0C77B1AB007F12AE /* APInt.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = APInt.h; sourceTree = ""; }; @@ -1071,6 +1074,7 @@ DE816FAC08CFB44C0093BDEF /* utils */, DE66F38D08ABF35C00323D32 /* docs */, 9FD3E56D0CA0116100E54D15 /* bindings */, + 9F7C2B690CB9496B00498408 /* test */, DE66F3FD08ABF37000323D32 /* examples */, DE66F38C08ABF35300323D32 /* CREDITS.TXT */, CFD99AA80AFE827B0068D19C /* LICENSE.TXT */, @@ -1170,6 +1174,33 @@ path = analysis; sourceTree = ""; }; + 9F7C2B690CB9496B00498408 /* test */ = { + isa = PBXGroup; + children = ( + 9F7C2C4B0CB9496C00498408 /* Bindings */, + ); + name = test; + path = ../test; + sourceTree = SOURCE_ROOT; + }; + 9F7C2C4B0CB9496C00498408 /* Bindings */ = { + isa = PBXGroup; + children = ( + 9F7C2C4C0CB9496C00498408 /* Ocaml */, + ); + path = Bindings; + sourceTree = ""; + }; + 9F7C2C4C0CB9496C00498408 /* Ocaml */ = { + isa = PBXGroup; + children = ( + 9F7C2C4F0CB9496C00498408 /* analysis.ml */, + 9F7C2C520CB9496C00498408 /* bitwriter.ml */, + 9F7C2C5D0CB9496C00498408 /* vmcore.ml */, + ); + path = Ocaml; + sourceTree = ""; + }; 9FA638E90C77B252007F12AE /* IPO */ = { isa = PBXGroup; children = ( diff --git a/bindings/ocaml/llvm/llvm.ml b/bindings/ocaml/llvm/llvm.ml index 0361001b6eb..9766d83810e 100644 --- a/bindings/ocaml/llvm/llvm.ml +++ b/bindings/ocaml/llvm/llvm.ml @@ -268,6 +268,9 @@ external visibility : llvalue -> visibility = "llvm_visibility" external set_visibility : visibility -> llvalue -> unit = "llvm_set_visibility" external alignment : llvalue -> int = "llvm_alignment" external set_alignment : int -> llvalue -> unit = "llvm_set_alignment" +external is_global_constant : llvalue -> bool = "llvm_is_global_constant" +external set_global_constant : bool -> llvalue -> unit + = "llvm_set_global_constant" (*--... Operations on global variables .....................................--*) external declare_global : lltype -> string -> llmodule -> llvalue diff --git a/bindings/ocaml/llvm/llvm.mli b/bindings/ocaml/llvm/llvm.mli index d2f6cb4ce7a..ae37e9d02d7 100644 --- a/bindings/ocaml/llvm/llvm.mli +++ b/bindings/ocaml/llvm/llvm.mli @@ -251,6 +251,9 @@ external visibility : llvalue -> visibility = "llvm_visibility" external set_visibility : visibility -> llvalue -> unit = "llvm_set_visibility" external alignment : llvalue -> int = "llvm_alignment" external set_alignment : int -> llvalue -> unit = "llvm_set_alignment" +external is_global_constant : llvalue -> bool = "llvm_is_global_constant" +external set_global_constant : bool -> llvalue -> unit + = "llvm_set_global_constant" (*--... Operations on global variables .....................................--*) external declare_global : lltype -> string -> llmodule -> llvalue diff --git a/bindings/ocaml/llvm/llvm_ocaml.c b/bindings/ocaml/llvm/llvm_ocaml.c index 4d721822f13..61115f2c19a 100644 --- a/bindings/ocaml/llvm/llvm_ocaml.c +++ b/bindings/ocaml/llvm/llvm_ocaml.c @@ -445,6 +445,17 @@ CAMLprim value llvm_set_thread_local(value IsThreadLocal, return Val_unit; } +/* llvalue -> bool */ +CAMLprim value llvm_is_global_constant(LLVMValueRef GlobalVar) { + return Val_bool(LLVMIsGlobalConstant(GlobalVar)); +} + +/* bool -> llvalue -> unit */ +CAMLprim value llvm_set_global_constant(value Flag, LLVMValueRef GlobalVar) { + LLVMSetGlobalConstant(GlobalVar, Bool_val(Flag)); + return Val_unit; +} + /*--... Operations on functions ............................................--*/ /* string -> lltype -> llmodule -> llvalue */ diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h index ee1f69f6111..3f8961b7651 100644 --- a/include/llvm-c/Core.h +++ b/include/llvm-c/Core.h @@ -324,6 +324,8 @@ LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar); void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal); int LLVMIsThreadLocal(LLVMValueRef GlobalVar); void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal); +int LLVMIsGlobalConstant(LLVMValueRef GlobalVar); +void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant); /* Operations on functions */ LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name, diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index 15a54b332ac..66ab03cb5e0 100644 --- a/lib/VMCore/Core.cpp +++ b/lib/VMCore/Core.cpp @@ -557,6 +557,17 @@ void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal) { unwrap(GlobalVar)->setThreadLocal(IsThreadLocal != 0); } +int LLVMIsGlobalConstant(LLVMValueRef GlobalVar) { + bool res = unwrap(GlobalVar)->isConstant(); + fprintf(stderr, "LLVMIsConstantGlobal(0x%08x) = %s\n", + (int) GlobalVar, res? "YES" : "NO"); + return unwrap(GlobalVar)->isConstant(); +} + +void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant) { + unwrap(GlobalVar)->setConstant(IsConstant != 0); +} + /*--.. Operations on functions .............................................--*/ LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name, diff --git a/test/Bindings/Ocaml/vmcore.ml b/test/Bindings/Ocaml/vmcore.ml index 0282241d0c9..8aa6e43603e 100644 --- a/test/Bindings/Ocaml/vmcore.ml +++ b/test/Bindings/Ocaml/vmcore.ml @@ -418,7 +418,15 @@ let test_global_variables () = *) group "delete"; let g = define_global "GVar05" fourty_two32 m in - delete_global g + delete_global g; + + (* RUN: grep -v {ConstGlobalVar.*constant} < %t.ll + *) + group "constant"; + let g = define_global "ConstGlobalVar" fourty_two32 m in + insist (not (is_global_constant g)); + set_global_constant true g; + insist (is_global_constant g) (*===-- Functions ---------------------------------------------------------===*)