ReadOnlyGlobalVariables: don't convert external global vars to lets

Because we don't know if external variables will be written

Fixes a miscompile
rdar://109476745
This commit is contained in:
Erik Eckstein
2023-05-19 16:11:30 +02:00
parent efe762de0b
commit 7bbf66ab5b
5 changed files with 24 additions and 7 deletions

View File

@@ -35,7 +35,8 @@ let readOnlyGlobalVariablesPass = ModulePass(name: "read-only-global-variables")
}
for g in moduleContext.globalVariables {
if !g.isPossiblyUsedExternally,
if !g.isAvailableExternally,
!g.isPossiblyUsedExternally,
!g.isLet,
!writtenGlobals.contains(g) {
g.setIsLet(to: true, moduleContext)

View File

@@ -35,6 +35,14 @@ final public class GlobalVariable : CustomStringConvertible, HasShortDescription
return bridged.isPossiblyUsedExternally()
}
/// True, if the linkage of the global indicates that it has a definition outside the
/// current compilation unit.
///
/// For example, `public_external` linkage.
public var isAvailableExternally: Bool {
return bridged.isAvailableExternally()
}
public var staticInitValue: SingleValueInstruction? {
bridged.getStaticInitializerValue().instruction as? SingleValueInstruction
}