Title: [282568] branches/safari-612-branch/Source/_javascript_Core
Revision
282568
Author
[email protected]
Date
2021-09-16 11:48:05 -0700 (Thu, 16 Sep 2021)

Log Message

Cherry-pick r281541. rdar://problem/83183498

    [Re-landing] Add some offlineasm enhancements.
    https://bugs.webkit.org/show_bug.cgi?id=229332
    rdar://82163923

    Reviewed by Keith Miller.

    1. Enhance "include" offlineasm Instruction to always attempt to include an asm
       file from <build-products>/usr/local/include/WebKitAdditions/ first.  If the
       specified file is not available there, then it will attempt to include the file
       from the same directory as the current source file (which in practice, means
       Source/_javascript_Core/llint/).

    2. Enhance "include" offlineasm Instruction to allow an optional file to be
       included if it exists.  For example, the following offlineasm code:

            include? LowLevelInterpreterAdditions

       ... will attempt to include a file LowLevelInterpreterAdditions.asm.  If the
       file does not exist, this will be a no-op.  Note: the "?" after the "include"
       means the include is optional.

    3. Enhanced "emit" offlineasm Instruction to be able to take more than one operand.

       "emit" used to just copy the string operand that follows into the generated
       LLIntAssembly.h.  Now, "emit" can take multiple comma separated operands, and
       will concatenate all the operands.

       Additionally, "emit" can now take a LocalLabelReference as an operand.  For
       example, this offline asm code:

               emit "b ", .done
               ...
            .done:

       ... will generate this inline asm code in LLIntAssembly.h:

            "b " LOCAL_LABEL_STRING(_offlineasm_someLabel_done) "\n"

       This makes it easier to emit branches to local labels.

    4. Also fixed LLInt code alignment for ARM_THUMB2 and ARM64.

       Previously, it was aligned using ".align 4" which means aligned on a 4
       instruction boundary.  Note: the interpretation of .align varies for different
       target CPU architectures.

       Now, we do the alignment using ".balign 4" which means align on a 4 byte
       boundary.  This is the intended alignment because ARM64 instruction size is
       4 bytes, and ARM_THUMB2 instruction size is either 2 bytes or 4 bytes.
       Using .align before was potentially wasting some code space.

    * llint/LowLevelInterpreter.asm:
    * llint/LowLevelInterpreter.cpp:
    * offlineasm/ast.rb:
    * offlineasm/parser.rb:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@281541 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Diff

Modified: branches/safari-612-branch/Source/_javascript_Core/ChangeLog (282567 => 282568)


--- branches/safari-612-branch/Source/_javascript_Core/ChangeLog	2021-09-16 18:47:45 UTC (rev 282567)
+++ branches/safari-612-branch/Source/_javascript_Core/ChangeLog	2021-09-16 18:48:05 UTC (rev 282568)
@@ -1,3 +1,125 @@
+2021-09-16  Russell Epstein  <[email protected]>
+
+        Cherry-pick r281541. rdar://problem/83183498
+
+    [Re-landing] Add some offlineasm enhancements.
+    https://bugs.webkit.org/show_bug.cgi?id=229332
+    rdar://82163923
+    
+    Reviewed by Keith Miller.
+    
+    1. Enhance "include" offlineasm Instruction to always attempt to include an asm
+       file from <build-products>/usr/local/include/WebKitAdditions/ first.  If the
+       specified file is not available there, then it will attempt to include the file
+       from the same directory as the current source file (which in practice, means
+       Source/_javascript_Core/llint/).
+    
+    2. Enhance "include" offlineasm Instruction to allow an optional file to be
+       included if it exists.  For example, the following offlineasm code:
+    
+            include? LowLevelInterpreterAdditions
+    
+       ... will attempt to include a file LowLevelInterpreterAdditions.asm.  If the
+       file does not exist, this will be a no-op.  Note: the "?" after the "include"
+       means the include is optional.
+    
+    3. Enhanced "emit" offlineasm Instruction to be able to take more than one operand.
+    
+       "emit" used to just copy the string operand that follows into the generated
+       LLIntAssembly.h.  Now, "emit" can take multiple comma separated operands, and
+       will concatenate all the operands.
+    
+       Additionally, "emit" can now take a LocalLabelReference as an operand.  For
+       example, this offline asm code:
+    
+               emit "b ", .done
+               ...
+            .done:
+    
+       ... will generate this inline asm code in LLIntAssembly.h:
+    
+            "b " LOCAL_LABEL_STRING(_offlineasm_someLabel_done) "\n"
+    
+       This makes it easier to emit branches to local labels.
+    
+    4. Also fixed LLInt code alignment for ARM_THUMB2 and ARM64.
+    
+       Previously, it was aligned using ".align 4" which means aligned on a 4
+       instruction boundary.  Note: the interpretation of .align varies for different
+       target CPU architectures.
+    
+       Now, we do the alignment using ".balign 4" which means align on a 4 byte
+       boundary.  This is the intended alignment because ARM64 instruction size is
+       4 bytes, and ARM_THUMB2 instruction size is either 2 bytes or 4 bytes.
+       Using .align before was potentially wasting some code space.
+    
+    * llint/LowLevelInterpreter.asm:
+    * llint/LowLevelInterpreter.cpp:
+    * offlineasm/ast.rb:
+    * offlineasm/parser.rb:
+    
+    
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@281541 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-08-24  Mark Lam  <[email protected]>
+
+            [Re-landing] Add some offlineasm enhancements.
+            https://bugs.webkit.org/show_bug.cgi?id=229332
+            rdar://82163923
+
+            Reviewed by Keith Miller.
+
+            1. Enhance "include" offlineasm Instruction to always attempt to include an asm
+               file from <build-products>/usr/local/include/WebKitAdditions/ first.  If the
+               specified file is not available there, then it will attempt to include the file
+               from the same directory as the current source file (which in practice, means
+               Source/_javascript_Core/llint/).
+
+            2. Enhance "include" offlineasm Instruction to allow an optional file to be
+               included if it exists.  For example, the following offlineasm code:
+
+                    include? LowLevelInterpreterAdditions
+
+               ... will attempt to include a file LowLevelInterpreterAdditions.asm.  If the
+               file does not exist, this will be a no-op.  Note: the "?" after the "include"
+               means the include is optional.
+
+            3. Enhanced "emit" offlineasm Instruction to be able to take more than one operand.
+
+               "emit" used to just copy the string operand that follows into the generated
+               LLIntAssembly.h.  Now, "emit" can take multiple comma separated operands, and
+               will concatenate all the operands.
+
+               Additionally, "emit" can now take a LocalLabelReference as an operand.  For
+               example, this offline asm code:
+
+                       emit "b ", .done
+                       ...
+                    .done:
+
+               ... will generate this inline asm code in LLIntAssembly.h:
+
+                    "b " LOCAL_LABEL_STRING(_offlineasm_someLabel_done) "\n"
+
+               This makes it easier to emit branches to local labels.
+
+            4. Also fixed LLInt code alignment for ARM_THUMB2 and ARM64.
+
+               Previously, it was aligned using ".align 4" which means aligned on a 4
+               instruction boundary.  Note: the interpretation of .align varies for different
+               target CPU architectures.
+
+               Now, we do the alignment using ".balign 4" which means align on a 4 byte
+               boundary.  This is the intended alignment because ARM64 instruction size is
+               4 bytes, and ARM_THUMB2 instruction size is either 2 bytes or 4 bytes.
+               Using .align before was potentially wasting some code space.
+
+            * llint/LowLevelInterpreter.asm:
+            * llint/LowLevelInterpreter.cpp:
+            * offlineasm/ast.rb:
+            * offlineasm/parser.rb:
+
 2021-09-08  Alan Coon  <[email protected]>
 
         Cherry-pick r282042. rdar://problem/82877251

Modified: branches/safari-612-branch/Source/_javascript_Core/llint/LowLevelInterpreter.asm (282567 => 282568)


--- branches/safari-612-branch/Source/_javascript_Core/llint/LowLevelInterpreter.asm	2021-09-16 18:47:45 UTC (rev 282567)
+++ branches/safari-612-branch/Source/_javascript_Core/llint/LowLevelInterpreter.asm	2021-09-16 18:48:05 UTC (rev 282568)
@@ -2554,3 +2554,5 @@
     crash()
 
 end
+
+include? LowLevelInterpreterAdditions

Modified: branches/safari-612-branch/Source/_javascript_Core/llint/LowLevelInterpreter.cpp (282567 => 282568)


--- branches/safari-612-branch/Source/_javascript_Core/llint/LowLevelInterpreter.cpp	2021-09-16 18:47:45 UTC (rev 282567)
+++ branches/safari-612-branch/Source/_javascript_Core/llint/LowLevelInterpreter.cpp	2021-09-16 18:48:05 UTC (rev 282568)
@@ -495,7 +495,7 @@
 #if CPU(ARM_THUMB2)
 #define OFFLINE_ASM_GLOBAL_LABEL(label)          \
     ".text\n"                                    \
-    ".align 4\n"                                 \
+    ".balign 4\n"                                 \
     ".globl " SYMBOL_STRING(label) "\n"          \
     HIDE_SYMBOL(label) "\n"                      \
     ".thumb\n"                                   \
@@ -504,7 +504,7 @@
 #elif CPU(ARM64)
 #define OFFLINE_ASM_GLOBAL_LABEL(label)         \
     ".text\n"                                   \
-    ".align 4\n"                                \
+    ".balign 4\n"                                \
     ".globl " SYMBOL_STRING(label) "\n"         \
     HIDE_SYMBOL(label) "\n"                     \
     SYMBOL_STRING(label) ":\n"

Modified: branches/safari-612-branch/Source/_javascript_Core/offlineasm/ast.rb (282567 => 282568)


--- branches/safari-612-branch/Source/_javascript_Core/offlineasm/ast.rb	2021-09-16 18:47:45 UTC (rev 282567)
+++ branches/safari-612-branch/Source/_javascript_Core/offlineasm/ast.rb	2021-09-16 18:48:05 UTC (rev 282568)
@@ -944,7 +944,15 @@
         when "globalAnnotation"
             $asm.putGlobalAnnotation
         when "emit"
-            $asm.puts "#{operands[0].dump}"
+            str = "";
+            for operand in operands do
+                if (operand.is_a? LocalLabelReference)
+                    str += operand.asmLabel
+                else
+                    str += "#{operand.dump}"
+                end
+            end
+            $asm.puts "#{str}"
         when "tagCodePtr", "tagReturnAddress", "untagReturnAddress", "removeCodePtrTag", "untagArrayPtr", "removeArrayPtrTag"
         else
             raise "Unhandled opcode #{opcode} at #{codeOriginString}"

Modified: branches/safari-612-branch/Source/_javascript_Core/offlineasm/parser.rb (282567 => 282568)


--- branches/safari-612-branch/Source/_javascript_Core/offlineasm/parser.rb	2021-09-16 18:47:45 UTC (rev 282567)
+++ branches/safari-612-branch/Source/_javascript_Core/offlineasm/parser.rb	2021-09-16 18:48:05 UTC (rev 282568)
@@ -200,6 +200,8 @@
             result << Token.new(CodeOrigin.new(file, lineNumber), $&)
         when /\A".*"/
             result << Token.new(CodeOrigin.new(file, lineNumber), $&)
+        when /\?/
+            result << Token.new(CodeOrigin.new(file, lineNumber), $&)
         else
             raise "Lexer error at #{CodeOrigin.new(file, lineNumber).to_s}, unexpected sequence #{str[0..20].inspect}"
         end
@@ -261,6 +263,9 @@
         @tokens = lex(data, fileName)
         @idx = 0
         @annotation = nil
+        # FIXME: CMake does not currently set BUILT_PRODUCTS_DIR.
+        # https://bugs.webkit.org/show_bug.cgi?id=229340
+        @buildProductsDirectory = ENV['BUILT_PRODUCTS_DIR'];
     end
     
     def parseError(*comment)
@@ -817,11 +822,22 @@
                 @idx += 1
             elsif @tokens[@idx] == "include"
                 @idx += 1
+                isOptional = false
+                if @tokens[@idx] == "?"
+                    isOptional = true
+                    @idx += 1
+                end
                 parseError unless isIdentifier(@tokens[@idx])
                 moduleName = @tokens[@idx].string
-                fileName = IncludeFile.new(moduleName, @tokens[@idx].codeOrigin.fileName.dirname).fileName
                 @idx += 1
-                list << parse(fileName)
+                additionsDirectoryName = "#{@buildProductsDirectory}/usr/local/include/WebKitAdditions/"
+                fileName = IncludeFile.new(moduleName, additionsDirectoryName).fileName
+                if not File.exists?(fileName)
+                    fileName = IncludeFile.new(moduleName, @tokens[@idx].codeOrigin.fileName.dirname).fileName
+                end
+                fileExists = File.exists?(fileName)
+                raise "File not found: #{fileName}" if not fileExists and not isOptional
+                list << parse(fileName) if fileExists
             else
                 parseError "Expecting terminal #{final} #{comment}"
             end
@@ -838,12 +854,22 @@
                 break
             elsif @tokens[@idx] == "include"
                 @idx += 1
+                isOptional = false
+                if @tokens[@idx] == "?"
+                    isOptional = true
+                    @idx += 1
+                end
                 parseError unless isIdentifier(@tokens[@idx])
                 moduleName = @tokens[@idx].string
-                fileName = IncludeFile.new(moduleName, @tokens[@idx].codeOrigin.fileName.dirname).fileName
                 @idx += 1
-                
-                fileList << fileName
+                additionsDirectoryName = "#{@buildProductsDirectory}/usr/local/include/WebKitAdditions/"
+                fileName = IncludeFile.new(moduleName, additionsDirectoryName).fileName
+                if not File.exists?(fileName)
+                    fileName = IncludeFile.new(moduleName, @tokens[@idx].codeOrigin.fileName.dirname).fileName
+                end
+                fileExists = File.exists?(fileName)
+                raise "File not found: #{fileName}" if not fileExists and not isOptional
+                fileList << fileName if fileExists
             else
                 @idx += 1
             end
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to