Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2213.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.2213 Author: eem Time: 16 May 2017, 9:34:50.55462 am UUID: 91a750c2-5478-49d7-9c19-26ddc976ddb1 Ancestors: VMMaker.oscog-eem.2212 Use _WIN32 and _WIN64 in place of WIN32 and WIN64 in C preprocessor expressions. =============== Diff against VMMaker.oscog-eem.2212 =============== Item was changed: ----- Method: CogX64Compiler class>>ifTranslateableAddWithOptionsTo: (in category 'translation') ----- ifTranslateableAddWithOptionsTo: aCollection "Override to create cogitX64.c and cogitX64Win64.c" (self wordSize = Cogit objectMemoryClass wordSize and: [self identifyingPredefinedMacros notNil]) ifTrue: [aCollection + "SysV must preceed _WIN64; see Cogit class>>#generateCodeStringForCogitDotC" + add: {self. {#ISA. self ISA. #ABI. #SysV}}; + add: {self. {#ISA. self ISA. #ABI. #'_WIN64'}}]! - add: {self. {#ISA. self ISA. #ABI. #SysV}}; - add: {self. {#ISA. self ISA. #ABI. #WIN64}}]! Item was changed: ----- Method: CogX64Compiler class>>initialize (in category 'class initialization') ----- initialize "Initialize various x64 instruction-related constants. [1] IA-32 IntelĀ® Architecture Software Developer's Manual Volume 2A: Instruction Set Reference, A-M" "CogX64Compiler initialize" self ~~ CogX64Compiler ifTrue: [^self]. initializationOptions ifNil: [ initializationOptions := Dictionary new ]. initializationOptions at: #ABI + ifPresent: [:abi| SysV := abi asUppercase ~= #WIN64 and: [abi asUppercase ~= #'_WIN64']] + ifAbsent: [SysV := true]. "Default ABI; set to true for SysV, false for WIN64/_WIN64" - ifPresent: [:abi| SysV := abi asUppercase ~= #WIN64] - ifAbsent: [SysV := true]. "Default ABI; set to true for SysV, false for WIN64" RAX := 0. RCX := 1. "Were they completely mad or simply sadistic?" RDX := 2. RBX := 3. RSP := 4. RBP := 5. RSI := 6. RDI := 7. R8 := 8. R9 := 9. R10 := 10. R11 := 11. R12 := 12. R13 := 13. R14 := 14. R15 := 15. XMM0L := 0. XMM1L := 1. XMM2L := 2. XMM3L := 3. XMM4L := 4. XMM5L := 5. XMM6L := 6. XMM7L := 7. XMM8L := 8. XMM9L := 9. XMM10L := 10. XMM11L := 11. XMM12L := 12. XMM13L := 13. XMM14L := 14. XMM15L := 15. "Mod R/M Mod fields. See [1] Sec 2.4, 2.5 & 2.6 & Table 2-2" ModRegInd := 0. ModRegIndSIB := 4. ModRegIndDisp32 := 5. ModRegRegDisp8 := 1. ModRegRegDisp32 := 2. ModReg := 3. "SIB Scaled Index modes. See [1] Sec 2.4, 2.5 & 2.6 & Table 2-3" SIB1 := 0. SIB2 := 1. SIB4 := 2. SIB8 := 3. "Specific instructions" self initializeSpecificOpcodes: #(CDQ IDIVR IMULRR CPUID LFENCE MFENCE SFENCE LOCK CMPXCHGAwR CMPXCHGMwrR XCHGAwR XCHGMwrR XCHGRR CLD REP MOVSB MOVSQ) in: thisContext method! Item was changed: ----- Method: CogX64Compiler class>>moduleName (in category 'translation') ----- moduleName "CogAbstractInstruction subclasses collect: [:ea| ea moduleName]" + ^'cogit', self ISA, ((initializationOptions at: #ABI ifAbsent: ['']) copyWithout: $_)! - ^'cogit', self ISA, (initializationOptions at: #ABI ifAbsent: [''])! Item was changed: ----- Method: Cogit class>>generateCodeStringForCogitDotC (in category 'translation') ----- generateCodeStringForCogitDotC "Generate a skeletal cogit.c that includes the relevant cogitFOO.c for the appropriate subclasses of CogAbstractInstruction. self generateCodeStringForCogitDotC" | string insertPosition abis defaultDef | abis := OrderedCollection new. string := String streamContents: [:s| s nextPutAll: '/* Automatically generated by\ ' withCRs. s nextPutAll: (CCodeGenerator monticelloDescriptionFor: self). s cr; nextPutAll: ' */'. s cr; cr; nextPut: $#. insertPosition := s position. self translateableInstructionSubclassesAndInstalledOptionsDo: [:class | | abi | s nextPutAll: 'if '. (abi := initializationOptions at: #ABI ifAbsent: []) ifNotNil: + [s nextPutAll: (abis addLast: abi); nextPutAll: ' && (']. - [s nextPutAll: (abis addLast: abi, 'ABI'); nextPutAll: ' && (']. class identifyingPredefinedMacros do: [:predefinedMacro| s nextPutAll: 'defined('; nextPutAll: predefinedMacro; nextPut: $)] separatedBy: [s nextPutAll: ' || ']. abi ifNotNil: [s nextPut: $)]. s cr; cr; nextPutAll: '# include "'; nextPutAll: class moduleName; nextPutAll: '.c"'. s cr; cr; nextPutAll: '#el']. s nextPutAll: 'se'. #( 'As yet no Cogit implementation appears to exist for your platform.' 'Consider implementing it, starting by adding a subclass of CogAbstractInstruction.') do: [:msg| s cr; nextPutAll: '# error '; nextPutAll: msg]. s cr; nextPutAll: '#endif'; cr]. abis isEmpty ifTrue: [^string]. defaultDef := String streamContents: [:s| s nextPutAll: '#if !!'. abis do: [:abi| s nextPutAll: abi] separatedBy: [s nextPutAll: ' && !!']. s cr; nextPutAll: '# define '; nextPutAll: abis first; nextPutAll: ' 1'; cr. s nextPutAll: '#endif'; cr; cr]. ^string copyReplaceFrom: insertPosition to: insertPosition - 1 with: defaultDef! Item was changed: ----- Method: StackInterpreter class>>preambleCCode (in category 'translation') ----- preambleCCode ^ '/* Disable Intel compiler inlining of warning which is used for breakpoints */ #pragma auto_inline(off) sqInt warnpid, erroronwarn; void warning(char *s) { /* Print an error message but don''t necessarily exit. */ if (erroronwarn) error(s); if (warnpid) printf("\n%s pid %ld\n", s, (long)warnpid); else printf("\n%s\n", s); } void warningat(char *s, int l) { /* ditto with line number. */ /* use alloca to call warning so one does not have to remember to set two breakpoints... */ char *sl = alloca(strlen(s) + 16); sprintf(sl, "%s %d", s, l); warning(sl); } #pragma auto_inline(on) void invalidCompactClassError(char *s) { /* Print a (compact) class index error message and exit. */ #if SPURVM printf("\nClass %s does not have the required class index\n", s); #else printf("\nClass %s does not have the required compact class index\n", s); #endif exit(-1); } /* * Define sigsetjmp and siglongjmp to be the most minimal setjmp/longjmp available on the platform. */ #undef sigsetjmp #undef siglongjmp + #if _WIN32 - #if WIN32 # define sigsetjmp(jb,ssmf) setjmp(jb) # define siglongjmp(jb,v) longjmp(jb,v) #else # define sigsetjmp(jb,ssmf) _setjmp(jb) # define siglongjmp(jb,v) _longjmp(jb,v) #endif #define odd(v) ((int)(v)&1) #define even(v) (!!odd(v)) '! Item was changed: ----- Method: StackInterpreter>>getCogVMFeatureFlags (in category 'internal interpreter access') ----- getCogVMFeatureFlags "Answer an array of flags indicating various optional features of the Cog VM. + Bit 0: supports two bytecode sets (MULTIPLEBYTECODESETS) + Bit 1: supports immutablity (IMMUTABILITY) + Bit 2: suffers from a UNIX setitimer signal-based heartbeat" - Bit 0: supports two btecode sets (MULTIPLEBYTECODESETS) - Bit 1: supports immtablity (IMMUTABILITY)" ^objectMemory integerObjectOf: (MULTIPLEBYTECODESETS ifTrue: [1] ifFalse: [0]) + + (IMMUTABILITY ifTrue: [2] ifFalse: [0]) + + (self cppIf: #'ITIMER_HEARTBEAT' ifTrue: [4] ifFalse: [0])! - + (IMMUTABILITY ifTrue: [2] ifFalse: [0])! Item was changed: ----- Method: ThreadedFFIPlugin class>>preambleCCode (in category 'translation') ----- preambleCCode "For a source of builtin defines grep for builtin_define in a gcc release config directory." ^' #include "sqAssert.h" /* for assert */ #define ThreadedFFIPlugin 1 /* to filter-out unwanted declarations from sqFFI.h */ #include "sqFFI.h" /* for logging and surface functions */ #include "sqCogStackAlignment.h" /* for STACK_ALIGN_BYTES and getsp() */ #ifdef _MSC_VER # define alloca _alloca #endif #if defined(__GNUC__) && (defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__)) # define setsp(sp) asm volatile ("movl %0,%%esp" : : "m"(sp)) # elif defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__) || defined(__amd64) || defined(__x86_64)) # define setsp(sp) asm volatile ("movq %0,%%rsp" : : "m"(sp)) # elif defined(__GNUC__) && (defined(__arm__)) # define setsp(sp) asm volatile ("ldr %%sp, %0" : : "m"(sp)) #endif #if !!defined(getsp) # define getsp() 0 #endif #if !!defined(setsp) # define setsp(ignored) 0 #endif #if !!defined(STACK_ALIGN_BYTES) # define STACK_ALIGN_BYTES 0 #endif /* !!defined(STACK_ALIGN_BYTES) */ /* For ABI that require stack alignment greater than natural word size */ #define MUST_ALIGN_STACK (STACK_ALIGN_BYTES > sizeof(void*)) #if defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__) /* Both Mac OS X x86 and Win32 x86 return structs of a power of two in size * less than or equal to eight bytes in length in registers. Linux never does so. */ # if __linux__ # define WIN32_X86_STRUCT_RETURN 0 # else # define WIN32_X86_STRUCT_RETURN 1 # endif + # if _WIN32 - # if WIN32 # define PLATFORM_API_USES_CALLEE_POPS_CONVENTION 1 # endif # elif defined(__amd64__) || defined(__x86_64__) || defined(__amd64) || defined(__x86_64) + # if _WIN32 | _WIN64 - # if WIN32 | WIN64 # define PLATFORM_API_USES_CALLEE_POPS_CONVENTION 1 # endif #endif /* defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__) */ #if !!defined(ALLOCA_LIES_SO_SETSP_BEFORE_CALL) # if defined(__MINGW32__) && !!defined(__clang__) && (__GNUC__ >= 3) && (defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__)) /* * cygwin -mno-cygwin (MinGW) gcc 3.4.x''s alloca is a library routine that answers * %esp + xx, so the outgoing stack is offset by one or more word if uncorrected. * Grab the actual stack pointer to correct. */ # define ALLOCA_LIES_SO_SETSP_BEFORE_CALL 1 # else # define ALLOCA_LIES_SO_SETSP_BEFORE_CALL 0 # endif #endif /* !!defined(ALLOCA_LIES_SO_SETSP_BEFORE_CALL) */ #if !!defined(PLATFORM_API_USES_CALLEE_POPS_CONVENTION) # define PLATFORM_API_USES_CALLEE_POPS_CONVENTION 0 #endif /* The dispatchOn:in:with:with: generates an unwanted call on error. Just squash it. */ #define error(foo) 0 #ifndef SQUEAK_BUILTIN_PLUGIN /* but print assert failures. */ void warning(char *s) { /* Print an error message but don''t exit. */ printf("\n%s\n", s); } #endif /* sanitize */ #ifdef SQUEAK_BUILTIN_PLUGIN # define EXTERN #else # define EXTERN extern #endif '! Item was changed: ----- Method: ThreadedIA32FFIPlugin>>returnStructInRegisters: (in category 'marshalling') ----- returnStructInRegisters: returnStructSize "Answer if a struct result of a given size is returned in memory or not." <cmacro: '(sz) (WIN32_X86_STRUCT_RETURN && (sz) <= 8 && !!((sz)&((sz)-1)))'> + ^returnStructSize <= 8 and: [returnStructSize isPowerOfTwo]! - ^returnStructSize <= 8 and: [(returnStructSize bitAnd: returnStructSize - 1) = 0]! Item was changed: ----- Method: ThreadedX64SysVFFIPlugin class>>excludingPredefinedMacros (in category 'translation') ----- excludingPredefinedMacros "Answer the predefined macros that disqualify the platforms a subclass handles, if any. This can be used to differentiate e.g. x64 Sys V from x64 Win64." + ^#('_WIN64')! - ^#('WIN64')! Item was changed: ----- Method: ThreadedX64Win64FFIPlugin class>>includingPredefinedMacros (in category 'translation') ----- includingPredefinedMacros "Answer the predefined macros that qualify the platforms a subclass handles, if any. These are anded together and with excludingPredefinedMacros, whereas identifyingPredefinedMacros are ored together. This can be used to differentiate e.g. x64 Sys V from x64 Win64." + ^#('_WIN64')! - ^#('WIN64')! |
Free forum by Nabble | Edit this page |