[PATCH] D14665: Support literal structs in mangled intrinsics.

Pat Gavlin via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 13 13:39:12 PST 2015


pgavlin created this revision.
pgavlin added reviewers: reames, sanjoy.
pgavlin added a subscriber: llvm-commits.

Literal structs are mangled as 'ls_' ( mangled fields) 's'. Mangling for structs is also changed to add a 's_' prefix and a 's' postfix to handle nested structs and struct names that may collide with other mangled types.

http://reviews.llvm.org/D14665

Files:
  lib/IR/Function.cpp
  test/CodeGen/Generic/overloaded-intrinsic-name.ll

Index: test/CodeGen/Generic/overloaded-intrinsic-name.ll
===================================================================
--- test/CodeGen/Generic/overloaded-intrinsic-name.ll
+++ test/CodeGen/Generic/overloaded-intrinsic-name.ll
@@ -44,7 +44,7 @@
 ; struct
 define %struct.test* @test_struct(%struct.test* %v) gc "statepoint-example" {
        %tok = call i32 (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0, %struct.test* %v)
-       %v-new = call %struct.test* @llvm.experimental.gc.relocate.p0struct.test(i32 %tok,  i32 7, i32 7)
+       %v-new = call %struct.test* @llvm.experimental.gc.relocate.p0struct.tests(i32 %tok,  i32 7, i32 7)
        ret %struct.test* %v-new
 }
 
@@ -54,4 +54,4 @@
 declare float* @llvm.experimental.gc.relocate.p0f32(i32, i32, i32)
 declare [3 x i32]* @llvm.experimental.gc.relocate.p0a3i32(i32, i32, i32)
 declare <3 x i32>* @llvm.experimental.gc.relocate.p0v3i32(i32, i32, i32)
-declare %struct.test* @llvm.experimental.gc.relocate.p0struct.test(i32, i32, i32)
+declare %struct.test* @llvm.experimental.gc.relocate.p0struct.tests(i32, i32, i32)
Index: lib/IR/Function.cpp
===================================================================
--- lib/IR/Function.cpp
+++ lib/IR/Function.cpp
@@ -462,13 +462,16 @@
 /// Returns a stable mangling for the type specified for use in the name
 /// mangling scheme used by 'any' types in intrinsic signatures.  The mangling
 /// of named types is simply their name.  Manglings for unnamed types consist
-/// of a prefix ('p' for pointers, 'a' for arrays, 'f_' for functions)
-/// combined with the mangling of their component types.  A vararg function
-/// type will have a suffix of 'vararg'.  Since function types can contain
-/// other function types, we close a function type mangling with suffix 'f'
-/// which can't be confused with it's prefix.  This ensures we don't have
-/// collisions between two unrelated function types. Otherwise, you might
-/// parse ffXX as f(fXX) or f(fX)X.  (X is a placeholder for any other type.)
+/// of a prefix ('p' for pointers, 'a' for arrays, 's_' or 'ls_' for structs,
+/// and 'f_' for functions) combined with the mangling of their component types.
+/// A vararg function type will have a suffix of 'vararg'.
+///
+/// Since function/struct types can contain other function/struct types, we
+/// close a function/struct type mangling with suffix 'f'/'s' which can't be
+/// confused with its prefix.  This ensures we don't have collisions between two
+/// unrelated function/struct types. Otherwise, you might parse ffXX as f(fXX)
+/// or f(fX)X.  (X is a placeholder for any other type.)
+///
 /// Manglings of integers, floats, and vectors ('i', 'f', and 'v' prefix in most
 /// cases) fall back to the MVT codepath, where they could be mangled to
 /// 'x86mmx', for example; matching on derived types is not sufficient to mangle
@@ -482,8 +485,14 @@
     Result += "a" + llvm::utostr(ATyp->getNumElements()) +
       getMangledTypeStr(ATyp->getElementType());
   } else if (StructType* STyp = dyn_cast<StructType>(Ty)) {
-    assert(!STyp->isLiteral() && "TODO: implement literal types");
-    Result += STyp->getName();
+    if (STyp->isLiteral()) {
+      Result += "ls_";
+      for (Type* Ty : STyp->elements())
+        Result += getMangledTypeStr(Ty);
+    } else
+      Result += "s_" + STyp->getName().str();
+    // Ensure nested struct types are distinguishable.
+    Result += "s";
   } else if (FunctionType* FT = dyn_cast<FunctionType>(Ty)) {
     Result += "f_" + getMangledTypeStr(FT->getReturnType());
     for (size_t i = 0; i < FT->getNumParams(); i++)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D14665.40174.patch
Type: text/x-patch
Size: 3685 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151113/a362fdb8/attachment.bin>


More information about the llvm-commits mailing list