[llvm-commits] [llvm] r166907 - in /llvm/trunk: lib/Transforms/IPO/ExtractGV.cpp test/Other/extract-alias.ll

Rafael Espindola rafael.espindola at gmail.com
Sun Oct 28 17:27:56 PDT 2012


Author: rafael
Date: Sun Oct 28 19:27:55 2012
New Revision: 166907

URL: http://llvm.org/viewvc/llvm-project?rev=166907&view=rev
Log:
llvm-extract was unable to handle aliases. It would leave a copy on the
output of both

llvm-extract foo.ll -func=bar
and
llvm-extract foo.ll -func=bar -delete

so the two new files could not be linked together anymore. With this change
alias are handled almost like functions and global variables. Almost because
with alias we cannot just clear the initializer/body, we have to create a new
declaration and replace the alias with it.

The net result is that now the output of the above commands can be linked
even if foo.ll has aliases.

Added:
    llvm/trunk/test/Other/extract-alias.ll
Modified:
    llvm/trunk/lib/Transforms/IPO/ExtractGV.cpp

Modified: llvm/trunk/lib/Transforms/IPO/ExtractGV.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/ExtractGV.cpp?rev=166907&r1=166906&r2=166907&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/ExtractGV.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/ExtractGV.cpp Sun Oct 28 19:27:55 2012
@@ -79,6 +79,36 @@
         I->setLinkage(GlobalValue::ExternalLinkage);
       }
 
+      // Visit the Aliases.
+      for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end();
+           I != E;) {
+        Module::alias_iterator CurI = I;
+        ++I;
+
+        if (CurI->hasLocalLinkage())
+          CurI->setVisibility(GlobalValue::HiddenVisibility);
+        CurI->setLinkage(GlobalValue::ExternalLinkage);
+
+        if (deleteStuff == (bool)Named.count(CurI)) {
+          Type *Ty =  CurI->getType()->getElementType();
+
+          CurI->removeFromParent();
+          llvm::Value *Declaration;
+          if (FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
+            Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage,
+                                           CurI->getName(), &M);
+
+          } else {
+            Declaration =
+              new GlobalVariable(M, Ty, false, GlobalValue::ExternalLinkage,
+                                 0, CurI->getName());
+
+          }
+          CurI->replaceAllUsesWith(Declaration);
+          delete CurI;
+        }
+      }
+
       return true;
     }
   };

Added: llvm/trunk/test/Other/extract-alias.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/extract-alias.ll?rev=166907&view=auto
==============================================================================
--- llvm/trunk/test/Other/extract-alias.ll (added)
+++ llvm/trunk/test/Other/extract-alias.ll Sun Oct 28 19:27:55 2012
@@ -0,0 +1,40 @@
+; RUN: llvm-extract -func foo -S < %s | FileCheck %s
+; RUN: llvm-extract -delete -func foo -S < %s | FileCheck --check-prefix=DELETE %s
+
+; Both aliases should be converted to declarations
+; CHECK:      @zeda0 = external global i32
+; CHECK:      define i32* @foo() {
+; CHECK-NEXT:  call void @a0bar()
+; CHECK-NEXT:  ret i32* @zeda0
+; CHECK-NEXT: }
+; CHECK:      declare void @a0bar()
+
+; DELETE:      @zed = global i32 0
+; DELETE:      @zeda0 = alias i32* @zed
+; DELETE-NEXT: @a0foo = alias i32* ()* @foo
+; DELETE-NEXT: @a0a0bar = alias void ()* @a0bar
+; DELETE-NEXT: @a0bar = alias void ()* @bar
+; DELETE:      declare i32* @foo()
+; DELETE:      define void @bar() {
+; DELETE-NEXT:  %c = call i32* @foo()
+; DELETE-NEXT:  ret void
+; DELETE-NEXT: }
+
+ at zed = global i32 0
+ at zeda0 = alias i32* @zed
+
+ at a0foo = alias i32* ()* @foo
+
+define i32* @foo() {
+  call void @a0bar()
+  ret i32* @zeda0
+}
+
+ at a0a0bar = alias void ()* @a0bar
+
+ at a0bar = alias void ()* @bar
+
+define void @bar() {
+  %c = call i32* @foo()
+  ret void
+}





More information about the llvm-commits mailing list