- 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