Added builder support for llvm.memset , llvm.memmove and llvm.memcpy intrinsics
For those, use specialized IR builder routines rather than manually
calling the intrinsic. The problem which the latter is that those
instrinsics are overloaded and - for reason not yet known - retrieving
them cause crash. So better strick to LLVM way of doing so - through
IRBuilder.
--- a/LLVMCEXT.st Sun Jun 26 06:51:27 2016 +0100
+++ b/LLVMCEXT.st Wed Jul 06 09:53:56 2016 +0100
@@ -99,6 +99,31 @@
self primitiveFailed
!
+BuildMemCpy: B _: Dst _: Src _: Size _: Align _: IsVolatile
+
+ <cdecl: LLVMValue "LLVMBuildMemSet" ( LLVMIRBuilder LLVMValue LLVMValue LLVMValue uint32 bool) >
+ self primitiveFailed
+
+ "Created: / 06-07-2016 / 09:37:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+BuildMemMove: B _: Dst _: Src _: Size _: Align _: IsVolatile
+
+ <cdecl: LLVMValue "LLVMBuildMemSet" ( LLVMIRBuilder LLVMValue LLVMValue LLVMValue uint32 bool) >
+ self primitiveFailed
+
+ "Created: / 06-07-2016 / 09:38:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+BuildMemSet: B _: Ptr _: Val _: Size _: Align _: IsVolatile
+
+ <cdecl: LLVMValue "LLVMBuildMemSet" ( LLVMIRBuilder LLVMValue LLVMValue LLVMValue uint32 bool) >
+ self primitiveFailed
+
+ "Created: / 06-07-2016 / 00:07:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified (format): / 06-07-2016 / 09:36:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
ConstantAsMetadata: Val
"@param Val: LLVMValueRef
@return: LLVMMetadataRef
--- a/LLVMExamples.st Sun Jun 26 06:51:27 2016 +0100
+++ b/LLVMExamples.st Wed Jul 06 09:53:56 2016 +0100
@@ -687,5 +687,34 @@
"Created: / 11-02-2016 / 20:15:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 12-02-2016 / 11:11:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+example9_memset
+ "
+ Creates a function that clears alloca()ted structure,
+ Shows use of llvm.memset intrinsic.
+ "
+
+ | module functionType function asm pointTy point |
+
+ module := LLVMModule newWithName: testSelector ? 'test'.
+
+ pointTy := LLVMType named: 'point_t'.
+ pointTy elementTypes: { LLVMType int32 . LLVMType int32 }.
+
+ functionType := LLVMType function: { } returning: LLVMType void.
+ function := module addFunctionNamed: 'test' type: functionType.
+
+ asm := function builder.
+ point := asm alloca: pointTy as: 'point'.
+ asm memset: point _: (LLVMConstant uint8: 0) _: (LLVMConstant uint64: (LLVMType int32 sizeInBytes * 2)) _: 1 _: false.
+ asm ret.
+ self halt.
+ "
+ LLVMExamples new example9_memset
+ "
+
+ "Created: / 06-07-2016 / 00:01:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 06-07-2016 / 09:46:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
--- a/LLVMIRBuilder.st Sun Jun 26 06:51:27 2016 +0100
+++ b/LLVMIRBuilder.st Wed Jul 06 09:53:56 2016 +0100
@@ -397,6 +397,45 @@
"Modified: / 12-02-2016 / 11:55:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
+!LLVMIRBuilder methodsFor:'instructions - intrinsics'!
+
+memcpy: dst _: src _: size _: align _: volatile
+ self assertIsValue: dst ofKind: LLVMPointerTypeKind.
+ self assertIsValue: src ofKind: LLVMPointerTypeKind.
+ self assertIsValue: size ofType: LLVMType int64.
+ self assertIsInteger32Unsigned: align.
+ self assertIsBoolean: volatile.
+
+ ^ LLVMCEXT BuildMemCpy: self _: dst _: src _: size _: align _: volatile
+
+ "Created: / 06-07-2016 / 09:45:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+memmove: ptr _: val _: size _: align _: volatile
+ self assertIsValue: ptr ofKind: LLVMPointerTypeKind.
+ self assertIsValue: val ofKind: LLVMIntegerTypeKind.
+ self assertIsValue: size ofType: LLVMType int64.
+ self assertIsInteger32Unsigned: align.
+ self assertIsBoolean: volatile.
+
+ ^ LLVMCEXT BuildMemMove: self _: ptr _: val _: size _: align _: volatile
+
+ "Created: / 06-07-2016 / 09:45:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+memset: ptr _: val _: size _: align _: volatile
+ self assertIsValue: ptr ofKind: LLVMPointerTypeKind.
+ self assertIsValue: val ofKind: LLVMIntegerTypeKind.
+ self assertIsValue: size ofType: LLVMType int64.
+ self assertIsInteger32Unsigned: align.
+ self assertIsBoolean: volatile.
+
+ ^ LLVMCEXT BuildMemSet: self _: ptr _: val _: size _: align _: volatile
+
+ "Created: / 06-07-2016 / 00:11:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 06-07-2016 / 09:41:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
!LLVMIRBuilder methodsFor:'instructions - memory'!
alloca: type
--- a/LLVMObject.st Sun Jun 26 06:51:27 2016 +0100
+++ b/LLVMObject.st Wed Jul 06 09:53:56 2016 +0100
@@ -272,6 +272,15 @@
"Created: / 23-09-2015 / 21:29:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
+assertIsInteger32Unsigned:value
+ <resource: #skipInDebuggersWalkBack>
+
+ self assert: value isInteger message: 'value is not an integer'.
+ self assert: (value between: 0 and: 16rFFFFFFFF) message: 'value out of range'
+
+ "Created: / 06-07-2016 / 00:11:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
assertIsInteger64Unsigned:value
<resource: #skipInDebuggersWalkBack>
--- a/LLVMTypeLabel.st Sun Jun 26 06:51:27 2016 +0100
+++ b/LLVMTypeLabel.st Wed Jul 06 09:53:56 2016 +0100
@@ -48,3 +48,10 @@
"Created: / 13-08-2015 / 16:52:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
+!LLVMTypeLabel class methodsFor:'documentation'!
+
+version_HG
+
+ ^ '$Changeset: <not expanded> $'
+! !
+
--- a/bc.mak Sun Jun 26 06:51:27 2016 +0100
+++ b/bc.mak Wed Jul 06 09:53:56 2016 +0100
@@ -31,7 +31,7 @@
LIBNAME=libjv_llvm_s
MODULE_PATH=llvm_s
-RESFILES=llvm_s.$(RES)
+RESFILES=jv_llvm_sWINrc.$(RES)
@@ -64,7 +64,7 @@
$(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
clean::
- del *.$(CSUFFIX)
+ -del *.$(CSUFFIX)
# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jv_llvm_sWINrc.rc Wed Jul 06 09:53:56 2016 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: jv_llvm_s.
+//
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 6,2,32767,32767
+ PRODUCTVERSION 6,2,6,0
+#if (__BORLANDC__)
+ FILEFLAGSMASK VS_FF_DEBUG | VS_FF_PRERELEASE
+ FILEFLAGS VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VS_USER_DEFINED
+#endif
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "CompanyName", "Jan Vrany\0"
+ VALUE "FileDescription", "Smalltalk(X) bindings to LLVM (LIB)\0"
+ VALUE "FileVersion", "6.2.32767.32767\0"
+ VALUE "InternalName", "jv:llvm_s\0"
+ VALUE "LegalCopyright", "Copyright 2015-now Jan Vrany\0"
+ VALUE "ProductName", "LLVM-S\0"
+ VALUE "ProductVersion", "6.2.6.0\0"
+ VALUE "ProductDate", "Wed, 06 Jul 2016 08:48:55 GMT\0"
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN // Language | Translation
+ VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+ END
+END
--- a/llvm_c_ext/.cproject Sun Jun 26 06:51:27 2016 +0100
+++ b/llvm_c_ext/.cproject Wed Jul 06 09:53:56 2016 +0100
@@ -24,32 +24,32 @@
<folderInfo id="cdt.managedbuild.config.gnu.so.debug.1530599687." name="/" resourcePath="">
<toolChain id="cdt.managedbuild.toolchain.gnu.so.debug.992304984" name="Linux GCC" nonInternalBuilderId="cdt.managedbuild.target.gnu.builder.so.debug" superClass="cdt.managedbuild.toolchain.gnu.so.debug">
<targetPlatform id="cdt.managedbuild.target.gnu.platform.so.debug.775544274" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.so.debug"/>
- <builder id="cdt.managedbuild.target.gnu.builder.so.debug.815687926" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.so.debug"/>
+ <builder id="cdt.managedbuild.target.gnu.builder.so.debug.815687926" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.so.debug"/>
<tool id="cdt.managedbuild.tool.gnu.archiver.base.2128453546" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.so.debug.166509465" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.so.debug">
- <option id="gnu.cpp.compiler.so.debug.option.optimization.level.1670438573" name="Optimization Level" superClass="gnu.cpp.compiler.so.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.so.debug.option.debugging.level.1886577773" name="Debug Level" superClass="gnu.cpp.compiler.so.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
- <option id="gnu.cpp.compiler.option.include.paths.877645702" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+ <option id="gnu.cpp.compiler.so.debug.option.optimization.level.1670438573" name="Optimization Level" superClass="gnu.cpp.compiler.so.debug.option.optimization.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.so.debug.option.debugging.level.1886577773" name="Debug Level" superClass="gnu.cpp.compiler.so.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.include.paths.877645702" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value=""${workspace_loc:/LLVM C API Extensions/include}""/>
<listOptionValue builtIn="false" value="/usr/lib/llvm-3.8/include"/>
</option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.1537013795" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
+ <option id="gnu.cpp.compiler.option.preprocessor.def.1537013795" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="__STDC_CONSTANT_MACROS"/>
<listOptionValue builtIn="false" value="__STDC_LIMIT_MACROS=1"/>
<listOptionValue builtIn="false" value="_GNU_SOURCE=1"/>
<listOptionValue builtIn="false" value="NDEBUG=1"/>
</option>
- <option id="gnu.cpp.compiler.option.optimization.flags.1137352585" name="Other optimization flags" superClass="gnu.cpp.compiler.option.optimization.flags" value="-g -fomit-frame-pointer -std=c++11 -fvisibility-inlines-hidden -fno-exceptions -fPIC -ffunction-sections -fdata-sections -Wcast-qual" valueType="string"/>
+ <option id="gnu.cpp.compiler.option.optimization.flags.1137352585" name="Other optimization flags" superClass="gnu.cpp.compiler.option.optimization.flags" useByScannerDiscovery="false" value="-g -fomit-frame-pointer -std=c++11 -fvisibility-inlines-hidden -fno-exceptions -fPIC -ffunction-sections -fdata-sections -Wcast-qual" valueType="string"/>
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1597913403" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
</tool>
<tool id="cdt.managedbuild.tool.gnu.c.compiler.so.debug.371564189" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.so.debug">
- <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.so.debug.option.optimization.level.575241098" name="Optimization Level" superClass="gnu.c.compiler.so.debug.option.optimization.level" valueType="enumerated"/>
- <option id="gnu.c.compiler.so.debug.option.debugging.level.166571313" name="Debug Level" superClass="gnu.c.compiler.so.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
- <option id="gnu.c.compiler.option.include.paths.1060938595" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+ <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.so.debug.option.optimization.level.575241098" name="Optimization Level" superClass="gnu.c.compiler.so.debug.option.optimization.level" useByScannerDiscovery="false" valueType="enumerated"/>
+ <option id="gnu.c.compiler.so.debug.option.debugging.level.166571313" name="Debug Level" superClass="gnu.c.compiler.so.debug.option.debugging.level" useByScannerDiscovery="false" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="gnu.c.compiler.option.include.paths.1060938595" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value=""${workspace_loc:/LLVM C API Extensions/include}""/>
<listOptionValue builtIn="false" value="/usr/lib/llvm-3.8/include"/>
</option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.969084918" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.969084918" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="__STDC_CONSTANT_MACROS=1"/>
<listOptionValue builtIn="false" value="__STDC_LIMIT_MACROS=1"/>
<listOptionValue builtIn="false" value="_GNU_SOURCE=1"/>
--- a/llvm_c_ext/include/llvm-c-ext/CoreExt.h Sun Jun 26 06:51:27 2016 +0100
+++ b/llvm_c_ext/include/llvm-c-ext/CoreExt.h Wed Jul 06 09:53:56 2016 +0100
@@ -311,6 +311,43 @@
* }
*/ // end of @defgroup constvalconv Constant value conversions
+
+/**
+ * @defgroup irbuilderintrin Intrinsics
+ *
+ * Set of builder functions to make use of various
+ * intrinsics.
+ */
+
+/**
+ * Create and insert a memset to the specified pointer and the
+ * specified value.
+ *
+ * If the pointer isn't an i8*, it will be converted.
+ */
+LLVMValueRef LLVMBuildMemSet(LLVMBuilderRef B, LLVMValueRef Ptr, LLVMValueRef Val, LLVMValueRef Size, uint32_t Align, uint32_t IsVolatile);
+
+
+/**
+ * Create and insert a memcpy between the specified pointers.
+ *
+ * If the pointers aren't i8*, they will be converted.
+ */
+LLVMValueRef LLVMBuildMemCpy(LLVMBuilderRef B, LLVMValueRef Dst, LLVMValueRef Src, LLVMValueRef Size, uint32_t Align, uint32_t IsVolatile);
+
+/**
+ * Create and insert a memmove between the specified pointers.
+ *
+ * If the pointers aren't i8*, they will be converted.
+ */
+LLVMValueRef LLVMBuildMemMove(LLVMBuilderRef B, LLVMValueRef Dst, LLVMValueRef Src, LLVMValueRef Size, uint32_t Align, uint32_t IsVolatile);
+
+
+/**
+ * }
+ */ // end of @defgroup irbuilderintrin Intrinsics
+
+
#ifdef __cplusplus
}
#endif
--- a/llvm_c_ext/lib/CoreExt.cpp Sun Jun 26 06:51:27 2016 +0100
+++ b/llvm_c_ext/lib/CoreExt.cpp Wed Jul 06 09:53:56 2016 +0100
@@ -148,3 +148,15 @@
// Not a constant integer value,
return 0;
}
+
+LLVMValueRef LLVMBuildMemSet(LLVMBuilderRef B, LLVMValueRef Ptr, LLVMValueRef Val, LLVMValueRef Size, uint32_t Align, uint32_t IsVolatile) {
+ return wrap(unwrap(B)->CreateMemSet(unwrap(Ptr), unwrap(Val), unwrap(Size), Align, IsVolatile));
+}
+
+LLVMValueRef LLVMBuildMemCpy(LLVMBuilderRef B, LLVMValueRef Dst, LLVMValueRef Src, LLVMValueRef Size, uint32_t Align, uint32_t IsVolatile) {
+ return wrap(unwrap(B)->CreateMemCpy(unwrap(Dst), unwrap(Src), unwrap(Size), Align, IsVolatile));
+}
+
+LLVMValueRef LLVMBuildMemMove(LLVMBuilderRef B, LLVMValueRef Dst, LLVMValueRef Src, LLVMValueRef Size, uint32_t Align, uint32_t IsVolatile) {
+ return wrap(unwrap(B)->CreateMemMove(unwrap(Dst), unwrap(Src), unwrap(Size), Align, IsVolatile));
+}
--- a/llvm_c_ext/lib/Makefile Sun Jun 26 06:51:27 2016 +0100
+++ b/llvm_c_ext/lib/Makefile Wed Jul 06 09:53:56 2016 +0100
@@ -7,7 +7,7 @@
LLVM_CONFIG ?= llvm-config-3.8
-CXXFLAGS_LLVM = $(shell $(LLVM_CONFIG) --cxxflags) -O0
+CXXFLAGS_LLVM = $(shell $(LLVM_CONFIG) --cxxflags) -O0 -ggdb3 -g
LDFLAGS_LLVM = $(shell $(LLVM_CONFIG) --ldflags)
LIBS_LLVM = $(shell $(LLVM_CONFIG) --libs) $(shell $(LLVM_CONFIG) --system-libs)
--- a/llvm_c_ext/test/Makefile Sun Jun 26 06:51:27 2016 +0100
+++ b/llvm_c_ext/test/Makefile Wed Jul 06 09:53:56 2016 +0100
@@ -2,9 +2,9 @@
BINARIES = $(patsubst %.c,%,$(SOURCES))
-LLVM_CONFIG=llvm-config-3.8
+LLVM_CONFIG ?= llvm-config-3.8
-CFLAGS_LLVM = $(shell $(LLVM_CONFIG) --cflags)
+CXXFLAGS_LLVM = $(shell $(LLVM_CONFIG) --cxxflags)
LDFLAGS_LLVM = $(shell $(LLVM_CONFIG) --ldflags)
LIBS_LLVM = $(shell $(LLVM_CONFIG) --libs) $(shell $(LLVM_CONFIG) --system-libs)
@@ -13,7 +13,7 @@
LIBS_LLVM_C_EXT = -lLLVM-C-EXT
-CFLAGS=$(CFLAGS_LLVM_C_EXT) $(CFLAGS_LLVM)
+CXXFLAGS=$(CFLAGS_LLVM_C_EXT) $(CXXFLAGS_LLVM)
LDFLAGS= $(LDFLAGS_LLVM_C_EXT) $(LDFLAGS_LLVM)
LIBS=$(LIBS_LLVM_C_EXT) $(LIBS_LLVM) -lstdc++
@@ -21,7 +21,7 @@
all: $(BINARIES)
%.o: %.c
- $(CXX) -c $(CFLAGS) -o $@ $<
+ $(CXX) -c $(CXXFLAGS) -o $@ $<
%: %.o
$(CC) $(LDFLAGS) -o $@ $< $(LIBS)
--- a/tests/bc.mak Sun Jun 26 06:51:27 2016 +0100
+++ b/tests/bc.mak Wed Jul 06 09:53:56 2016 +0100
@@ -31,7 +31,7 @@
LIBNAME=libjv_llvm_s_tests
MODULE_PATH=llvm_s\tests
-RESFILES=tests.$(RES)
+RESFILES=jv_llvm_s_testsWINrc.$(RES)
@@ -69,7 +69,7 @@
$(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
clean::
- del *.$(CSUFFIX)
+ -del *.$(CSUFFIX)
# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/jv_llvm_s_testsWINrc.rc Wed Jul 06 09:53:56 2016 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: jv_llvm_s_tests.
+//
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 6,2,32767,32767
+ PRODUCTVERSION 6,2,6,0
+#if (__BORLANDC__)
+ FILEFLAGSMASK VS_FF_DEBUG | VS_FF_PRERELEASE
+ FILEFLAGS VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VS_USER_DEFINED
+#endif
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "CompanyName", "My Company\0"
+ VALUE "FileDescription", "Class Library (LIB)\0"
+ VALUE "FileVersion", "6.2.32767.32767\0"
+ VALUE "InternalName", "jv:llvm_s/tests\0"
+ VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
+ VALUE "ProductName", "LibraryName\0"
+ VALUE "ProductVersion", "6.2.6.0\0"
+ VALUE "ProductDate", "Wed, 06 Jul 2016 08:48:57 GMT\0"
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN // Language | Translation
+ VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+ END
+END