Files
codeql/swift/tools/tracing-config.lua
Josh Soref 480f1e24af spelling: unsupported
Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
2022-10-13 19:43:27 -04:00

86 lines
3.1 KiB
Lua

function RegisterExtractorPack(id)
local extractorDirectory = GetPlatformToolsDirectory()
local relativeSwiftExtractor = extractorDirectory .. 'extractor'
local swiftExtractor = AbsolutifyExtractorPath(id, relativeSwiftExtractor)
function indexOf(array, value)
for i, v in ipairs(array) do
if v == value then
return i
end
end
return nil
end
-- removes unsupported CLI arg including the following how_many args
function strip_unsupported_arg(args, arg, how_many)
local index = indexOf(args, arg)
if index then
table.remove(args, index)
while (how_many > 0)
do
table.remove(args, index)
how_many = how_many - 1
end
end
end
function strip_unsupported_args(args)
strip_unsupported_arg(args, '-emit-localized-strings', 0)
strip_unsupported_arg(args, '-emit-localized-strings-path', 1)
strip_unsupported_arg(args, '-stack-check', 0)
end
-- xcodebuild does not always specify the -resource-dir in which case the compiler falls back
-- to a resource-dir based on its path
-- here we mimic this behavior externally
-- without a proper -resource-dir compiler-specific headers cannot be found which leads to
-- broken extraction
function insert_resource_dir_if_needed(compilerPath, args)
local resource_dir_index = indexOf(args, '-resource-dir')
if resource_dir_index then
return
end
-- derive -resource-dir based on the compilerPath
-- e.g.: /usr/bin/swift-frontend -> /usr/bin/../lib/swift
local last_slash_index = string.find(compilerPath, "/[^/]*$")
local compiler_dir = string.sub(compilerPath, 1, last_slash_index)
local resource_dir = compiler_dir .. '../lib/swift'
table.insert(args, '-resource-dir')
table.insert(args, resource_dir)
end
function SwiftMatcher(compilerName, compilerPath, compilerArguments, lang)
-- Only match binaries names `swift-frontend`
if compilerName ~= 'swift-frontend' then return nil end
-- Skip the invocation in case it's not called in `-frontend` mode
if compilerArguments.argv[1] ~= '-frontend' then return nil end
-- Drop the `-frontend` argument
table.remove(compilerArguments.argv, 1)
-- Skip "info" queries in case there is nothing to extract
if compilerArguments.argv[1] == '-print-target-info' then
return nil
end
if compilerArguments.argv[1] == '-emit-supported-features' then
return nil
end
strip_unsupported_args(compilerArguments.argv)
insert_resource_dir_if_needed(compilerPath, compilerArguments.argv)
return {
trace = true,
replace = false,
order = ORDER_AFTER,
invocation = {path = swiftExtractor, arguments = compilerArguments}
}
end
return {SwiftMatcher}
end
-- Return a list of minimum supported versions of the configuration file format
-- return one entry per supported major version.
function GetCompatibleVersions() return {'1.0.0'} end