Skip to content

Commit 36f67ac

Browse files
committed
"Namespace" all the local strings
Since all the files are generated from separate tasks, we don't have a global LLVM IR state which can keep track of strings and ensure that there are no duplicate symbol names. To prevent potential clashes, each generator now sets the default string group name which is unique for each module. In the future, we should try to manage strings globally (which would also result in more de-duplication)
1 parent a781d87 commit 36f67ac

9 files changed

+28
-8
lines changed

src/Xamarin.Android.Build.Tasks/Utilities/ApplicationConfigNativeAssemblyGenerator.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ public ApplicationConfigNativeAssemblyGenerator (IDictionary<string, string> env
203203

204204
protected override void Construct (LlvmIrModule module)
205205
{
206+
module.DefaultStringGroup = "env";
207+
206208
MapStructures (module);
207209

208210
module.AddGlobalVariable ("format_tag", FORMAT_TAG, comment: $" 0x{FORMAT_TAG:x}");
@@ -211,7 +213,7 @@ protected override void Construct (LlvmIrModule module)
211213
var envVars = new LlvmIrGlobalVariable (environmentVariables, "app_environment_variables") {
212214
Comment = " Application environment variables array, name:value",
213215
};
214-
module.Add (envVars, stringGroupName: "env", stringGroupComment: " Application environment variables name:value pairs");
216+
module.Add (envVars, stringGroupName: "env.var", stringGroupComment: " Application environment variables name:value pairs");
215217

216218
var sysProps = new LlvmIrGlobalVariable (systemProperties, "app_system_properties") {
217219
Comment = " System properties defined by the application",

src/Xamarin.Android.Build.Tasks/Utilities/CompressedAssembliesNativeAssemblyGenerator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ void InitCompressedAssemblies (out List<LlvmIrGlobalVariable>? compressedAssembl
149149

150150
protected override void Construct (LlvmIrModule module)
151151
{
152+
module.DefaultStringGroup = "cas";
153+
152154
MapStructures (module);
153155

154156
InitCompressedAssemblies (

src/Xamarin.Android.Build.Tasks/Utilities/JniRemappingAssemblyGenerator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,8 @@ uint GetLength (string str)
284284

285285
protected override void Construct (LlvmIrModule module)
286286
{
287+
module.DefaultStringGroup = "jremap";
288+
287289
MapStructures (module);
288290
List<StructureInstance<JniRemappingTypeReplacementEntry>>? typeReplacements;
289291
List<StructureInstance<JniRemappingIndexTypeEntry>>? methodIndexTypes;

src/Xamarin.Android.Build.Tasks/Utilities/LlvmIrGenerator/LlvmIrModule.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ partial class LlvmIrModule
4949

5050
public readonly LlvmIrTypeCache TypeCache;
5151

52+
public string? DefaultStringGroup { get; set; }
53+
5254
public LlvmIrModule (LlvmIrTypeCache cache, TaskLoggingHelper log)
5355
{
5456
this.log = log;
@@ -405,7 +407,7 @@ void AddStandardGlobalVariable (LlvmIrGlobalVariable variable)
405407
void EnsureStringManager ()
406408
{
407409
if (stringManager == null) {
408-
stringManager = new LlvmIrStringManager (log);
410+
stringManager = new LlvmIrStringManager (log, DefaultStringGroup);
409411
}
410412
}
411413

src/Xamarin.Android.Build.Tasks/Utilities/LlvmIrGenerator/LlvmIrStringManager.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ partial class LlvmIrModule
99
{
1010
protected class LlvmIrStringManager
1111
{
12+
readonly string defaultGroupName = "str";
13+
1214
Dictionary<StringHolder, LlvmIrStringVariable> stringSymbolCache = new Dictionary<StringHolder, LlvmIrStringVariable> ();
1315
Dictionary<string, LlvmIrStringGroup> stringGroupCache = new Dictionary<string, LlvmIrStringGroup> (StringComparer.Ordinal);
1416
List<LlvmIrStringGroup> stringGroups = new List<LlvmIrStringGroup> ();
@@ -18,9 +20,13 @@ protected class LlvmIrStringManager
1820

1921
public List<LlvmIrStringGroup> StringGroups => stringGroups;
2022

21-
public LlvmIrStringManager (TaskLoggingHelper log)
23+
public LlvmIrStringManager (TaskLoggingHelper log, string? defaultStringGroup = null)
2224
{
2325
this.log = log;
26+
if (!String.IsNullOrEmpty (defaultStringGroup)) {
27+
defaultGroupName = defaultStringGroup;
28+
}
29+
2430
defaultGroup = new LlvmIrStringGroup ();
2531
stringGroupCache.Add (String.Empty, defaultGroup);
2632
stringGroups.Add (defaultGroup);
@@ -52,7 +58,7 @@ LlvmIrStringVariable Add (StringHolder holder, string? groupName = null, string?
5258
string groupPrefix;
5359
if (String.IsNullOrEmpty (groupName) || String.Compare ("str", groupName, StringComparison.Ordinal) == 0) {
5460
group = defaultGroup;
55-
groupPrefix = ".str";
61+
groupPrefix = $".{defaultGroupName}";
5662
} else if (!stringGroupCache.TryGetValue (groupName, out group) || group == null) {
5763
group = new LlvmIrStringGroup (groupComment ?? groupName);
5864
stringGroups.Add (group);

src/Xamarin.Android.Build.Tasks/Utilities/LlvmIrGenerator/LlvmIrVariable.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,8 @@ class LlvmIrStringVariable : LlvmIrGlobalVariable
301301
public string IrType { get; }
302302
public bool IsConstantStringLiteral { get; }
303303

304-
public LlvmIrStringVariable (string name, StringHolder value)
305-
: base (typeof(string), name, LlvmIrVariableOptions.LocalString)
304+
public LlvmIrStringVariable (string name, StringHolder value, LlvmIrVariableOptions? options = null)
305+
: base (typeof(string), name, options ?? LlvmIrVariableOptions.GlobalConstexprString)
306306
{
307307
Value = value;
308308
Encoding = value.Encoding;
@@ -322,8 +322,8 @@ public LlvmIrStringVariable (string name, StringHolder value)
322322
}
323323
}
324324

325-
public LlvmIrStringVariable (string name, string value, LlvmIrStringEncoding encoding, StringComparison comparison = StringComparison.Ordinal)
326-
: this (name, new StringHolder (value, encoding, comparison))
325+
public LlvmIrStringVariable (string name, string value, LlvmIrStringEncoding encoding, StringComparison comparison = StringComparison.Ordinal, LlvmIrVariableOptions? options = null)
326+
: this (name, new StringHolder (value, encoding, comparison), options)
327327
{}
328328
}
329329

src/Xamarin.Android.Build.Tasks/Utilities/MarshalMethodsNativeAssemblyGenerator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,8 @@ void AddParameter (Type type)
592592

593593
protected override void Construct (LlvmIrModule module)
594594
{
595+
module.DefaultStringGroup = "mm";
596+
595597
MapStructures (module);
596598

597599
Init ();

src/Xamarin.Android.Build.Tasks/Utilities/TypeMappingDebugNativeAssemblyGenerator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ public TypeMappingDebugNativeAssemblyGenerator (TaskLoggingHelper log, TypeMapGe
129129

130130
protected override void Construct (LlvmIrModule module)
131131
{
132+
module.DefaultStringGroup = "tmd";
133+
132134
MapStructures (module);
133135

134136
if (data.ManagedToJavaMap != null && data.ManagedToJavaMap.Count > 0) {

src/Xamarin.Android.Build.Tasks/Utilities/TypeMappingReleaseNativeAssemblyGenerator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ public TypeMappingReleaseNativeAssemblyGenerator (TaskLoggingHelper log, NativeT
189189

190190
protected override void Construct (LlvmIrModule module)
191191
{
192+
module.DefaultStringGroup = "tmr";
193+
192194
MapStructures (module);
193195

194196
var cs = new ConstructionState ();

0 commit comments

Comments
 (0)