2017-08-12 16:48:01 +00:00
|
|
|
#!/usr/bin/env ruby
|
|
|
|
|
2020-08-29 13:27:11 +00:00
|
|
|
# Copyright (C) 2011-2018 Apple Inc. All rights reserved.
|
2017-08-12 16:48:01 +00:00
|
|
|
#
|
|
|
|
# Redistribution and use in source and binary forms, with or without
|
|
|
|
# modification, are permitted provided that the following conditions
|
|
|
|
# are met:
|
|
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer.
|
|
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
|
|
# documentation and/or other materials provided with the distribution.
|
|
|
|
#
|
|
|
|
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
|
|
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
|
|
|
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
|
|
|
# THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
|
|
|
|
$: << File.dirname(__FILE__)
|
|
|
|
|
|
|
|
require "config"
|
|
|
|
require "backends"
|
|
|
|
require "digest/sha1"
|
|
|
|
require "offsets"
|
|
|
|
require "parser"
|
|
|
|
require "self_hash"
|
|
|
|
require "settings"
|
|
|
|
require "transform"
|
|
|
|
|
|
|
|
IncludeFile.processIncludeOptions()
|
|
|
|
|
|
|
|
inputFlnm = ARGV.shift
|
2020-08-29 13:27:11 +00:00
|
|
|
settingsFlnm = ARGV.shift
|
2017-08-12 16:48:01 +00:00
|
|
|
outputFlnm = ARGV.shift
|
|
|
|
|
2020-08-29 13:27:11 +00:00
|
|
|
validBackends = canonicalizeBackendNames(ARGV.shift.split(/[,\s]+/))
|
|
|
|
includeOnlyBackends(validBackends)
|
|
|
|
|
2022-10-23 02:55:20 +00:00
|
|
|
variants = ARGV.shift.split(/[,\s]+/)
|
|
|
|
|
2020-08-29 13:27:11 +00:00
|
|
|
begin
|
2022-10-23 02:55:20 +00:00
|
|
|
configurationList = configurationIndicesForVariants(settingsFlnm, variants)
|
2020-08-29 13:27:11 +00:00
|
|
|
rescue MissingMagicValuesException
|
|
|
|
$stderr.puts "OffsetExtractor: No magic values found. Skipping offsets extractor file generation."
|
|
|
|
exit 1
|
2017-08-12 16:48:01 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def emitMagicNumber
|
|
|
|
OFFSET_MAGIC_NUMBERS.each {
|
|
|
|
| number |
|
|
|
|
$output.puts "unsigned(#{number}),"
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2020-08-29 13:27:11 +00:00
|
|
|
configurationHash = Digest::SHA1.hexdigest(configurationList.join(' '))
|
|
|
|
inputHash = "// OffsetExtractor input hash: #{parseHash(inputFlnm)} #{configurationHash} #{selfHash}"
|
2017-08-12 16:48:01 +00:00
|
|
|
|
|
|
|
if FileTest.exist? outputFlnm
|
|
|
|
File.open(outputFlnm, "r") {
|
|
|
|
| inp |
|
|
|
|
firstLine = inp.gets
|
|
|
|
if firstLine and firstLine.chomp == inputHash
|
2022-10-23 02:55:20 +00:00
|
|
|
# Nothing changed.
|
2017-08-12 16:48:01 +00:00
|
|
|
exit 0
|
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2020-08-29 13:27:11 +00:00
|
|
|
ast = parse(inputFlnm)
|
|
|
|
settingsCombinations = computeSettingsCombinations(ast)
|
2017-08-12 16:48:01 +00:00
|
|
|
|
|
|
|
File.open(outputFlnm, "w") {
|
|
|
|
| outp |
|
|
|
|
$output = outp
|
|
|
|
outp.puts inputHash
|
|
|
|
|
2020-08-29 13:27:11 +00:00
|
|
|
configurationList.each {
|
|
|
|
| configIndex |
|
|
|
|
forSettings(settingsCombinations[configIndex], ast) {
|
|
|
|
| concreteSettings, lowLevelAST, backend |
|
|
|
|
|
|
|
|
lowLevelAST = lowLevelAST.demacroify({})
|
|
|
|
offsetsList = offsetsList(lowLevelAST)
|
|
|
|
sizesList = sizesList(lowLevelAST)
|
|
|
|
constsList = constsList(lowLevelAST)
|
|
|
|
|
|
|
|
emitCodeInConfiguration(concreteSettings, lowLevelAST, backend) {
|
|
|
|
constsList.each_with_index {
|
|
|
|
| const, index |
|
|
|
|
outp.puts "constexpr int64_t constValue#{index} = static_cast<int64_t>(#{const.value});"
|
|
|
|
}
|
|
|
|
outp.puts "static const int64_t offsetExtractorTable[] = {"
|
|
|
|
OFFSET_HEADER_MAGIC_NUMBERS.each {
|
|
|
|
| number |
|
|
|
|
outp.puts "unsigned(#{number}),"
|
|
|
|
}
|
|
|
|
|
|
|
|
emitMagicNumber
|
|
|
|
outp.puts "#{configIndex},"
|
|
|
|
offsetsList.each {
|
|
|
|
| offset |
|
|
|
|
emitMagicNumber
|
|
|
|
outp.puts "OFFLINE_ASM_OFFSETOF(#{offset.struct}, #{offset.field}),"
|
|
|
|
}
|
|
|
|
sizesList.each {
|
|
|
|
| sizeof |
|
|
|
|
emitMagicNumber
|
|
|
|
outp.puts "sizeof(#{sizeof.struct}),"
|
|
|
|
}
|
|
|
|
constsList.each_with_index {
|
|
|
|
| const, index |
|
|
|
|
emitMagicNumber
|
|
|
|
outp.puts "constValue#{index},"
|
|
|
|
}
|
|
|
|
outp.puts "};"
|
|
|
|
}
|
2017-08-12 16:48:01 +00:00
|
|
|
}
|
|
|
|
}
|
2020-08-29 13:27:11 +00:00
|
|
|
|
|
|
|
outp.puts "static const int64_t offsetExtractorTable[] = { };" if not configurationList.size
|
|
|
|
|
2017-08-12 16:48:01 +00:00
|
|
|
}
|