Skip to content

Commit 1b44c07

Browse files
committed
Let's try this
1 parent 97e2edd commit 1b44c07

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

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

+11-2
Original file line numberDiff line numberDiff line change
@@ -326,13 +326,22 @@ void WriteTypeAndValue (GeneratorWriteContext context, LlvmIrVariable variable,
326326
throw new InvalidOperationException ($"Internal error: variable '{variable.Name}'' of type {variable.Type} must not have a null value");
327327
}
328328

329-
if (valueType != variable.Type && !LlvmIrModule.NameValueArrayType.IsAssignableFrom (variable.Type)) {
329+
if (!IsValueAssignableFrom (valueType, variable) && !IsValueAssignableFrom (LlvmIrModule.NameValueArrayType, variable)) {
330330
throw new InvalidOperationException ($"Internal error: variable type '{variable.Type}' is different to its value type, '{valueType}'");
331331
}
332332

333333
WriteValue (context, valueType, variable);
334334
}
335335

336+
bool IsValueAssignableFrom (Type valueType, LlvmIrVariable variable)
337+
{
338+
if (valueType != typeof(string) && valueType != typeof(StringHolder)) {
339+
return valueType.IsAssignableFrom (variable.Type);
340+
}
341+
342+
return variable.Type == typeof(string) || variable.Type == typeof(StringHolder);
343+
}
344+
336345
ulong GetAggregateValueElementCount (GeneratorWriteContext context, LlvmIrVariable variable) => GetAggregateValueElementCount (context, variable.Type, variable.Value, variable as LlvmIrGlobalVariable);
337346

338347
ulong GetAggregateValueElementCount (GeneratorWriteContext context, Type type, object? value, LlvmIrGlobalVariable? globalVariable = null)
@@ -717,7 +726,7 @@ void WriteValue (GeneratorWriteContext context, Type type, object? value, LlvmIr
717726
return;
718727
}
719728

720-
if (type == typeof(string)) {
729+
if (type == typeof(string) || type == typeof(StringHolder)) {
721730
if (value == null) {
722731
context.Output.Write ("null");
723732
return;

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

+17-6
Original file line numberDiff line numberDiff line change
@@ -273,14 +273,15 @@ public LlvmIrGlobalVariable AddGlobalVariable (Type type, string name, object? v
273273
ret = new LlvmIrStringVariable (name, new StringHolder ((string?)value)) {
274274
Comment = comment,
275275
};
276+
AddStringGlobalVariable ((LlvmIrStringVariable)ret);
276277
} else {
277278
ret = new LlvmIrGlobalVariable (type, name, options) {
278279
Value = value,
279280
Comment = comment,
280281
};
282+
Add (ret);
281283
}
282284

283-
Add (ret);
284285
return ret;
285286
}
286287

@@ -401,19 +402,29 @@ void AddStandardGlobalVariable (LlvmIrGlobalVariable variable)
401402
globalVariables.Add (variable);
402403
}
403404

405+
void EnsureStringManager ()
406+
{
407+
if (stringManager == null) {
408+
stringManager = new LlvmIrStringManager (log);
409+
}
410+
}
411+
404412
void AddStringGlobalVariable (LlvmIrStringVariable variable, string? stringGroupName = null, string? stringGroupComment = null, string? symbolSuffix = null)
405413
{
406-
RegisterString ((string)variable.Value, stringGroupName, stringGroupComment, symbolSuffix, variable.Encoding);
414+
RegisterString (variable, stringGroupName, stringGroupComment, symbolSuffix);
407415
AddStandardGlobalVariable (variable);
408416
}
409417

418+
public void RegisterString (LlvmIrStringVariable variable, string? stringGroupName = null, string? stringGroupComment = null, string? symbolSuffix = null)
419+
{
420+
EnsureStringManager ();
421+
stringManager.Add (variable, stringGroupName, stringGroupComment, symbolSuffix);
422+
}
423+
410424
public void RegisterString (string value, string? stringGroupName = null, string? stringGroupComment = null, string? symbolSuffix = null,
411425
LlvmIrStringEncoding encoding = LlvmIrStringEncoding.UTF8, StringComparison comparison = StringComparison.Ordinal)
412426
{
413-
if (stringManager == null) {
414-
stringManager = new LlvmIrStringManager (log);
415-
}
416-
427+
EnsureStringManager ();
417428
stringManager.Add (value, stringGroupName, stringGroupComment, symbolSuffix, encoding, comparison);
418429
}
419430

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,24 @@ public LlvmIrStringManager (TaskLoggingHelper log)
2626
stringGroups.Add (defaultGroup);
2727
}
2828

29+
public LlvmIrStringVariable Add (LlvmIrStringVariable variable, string? groupName = null, string? groupComment = null, string? symbolSuffix = null)
30+
{
31+
// Let it throw if Value isn't a StringHolder, it must be.
32+
return Add((StringHolder)variable.Value, groupName, groupComment, symbolSuffix);
33+
}
34+
2935
public LlvmIrStringVariable Add (string value, string? groupName = null, string? groupComment = null, string? symbolSuffix = null,
3036
LlvmIrStringEncoding encoding = LlvmIrStringEncoding.UTF8, StringComparison comparison = StringComparison.Ordinal)
3137
{
3238
if (value == null) {
3339
throw new ArgumentNullException (nameof (value));
3440
}
3541

36-
var holder = new StringHolder (value, encoding, comparison);
42+
return Add (new StringHolder (value, encoding, comparison), groupName, groupComment, symbolSuffix);
43+
}
44+
45+
LlvmIrStringVariable Add (StringHolder holder, string? groupName = null, string? groupComment = null, string? symbolSuffix = null)
46+
{
3747
if (stringSymbolCache.TryGetValue (holder, out LlvmIrStringVariable? stringVar) && stringVar != null) {
3848
return stringVar;
3949
}

0 commit comments

Comments
 (0)