[llvm-commits] [llvm] r114614 - in /llvm/trunk: test/Other/extract.ll tools/llvm-extract/llvm-extract.cpp
Dan Gohman
gohman at apple.com
Wed Sep 22 17:33:13 PDT 2010
Author: djg
Date: Wed Sep 22 19:33:13 2010
New Revision: 114614
URL: http://llvm.org/viewvc/llvm-project?rev=114614&view=rev
Log:
Fix llvm-extract -delete's lazy loading to materialize the functions that
will not be deleted, rather than the ones that will.
Added:
llvm/trunk/test/Other/extract.ll
Modified:
llvm/trunk/tools/llvm-extract/llvm-extract.cpp
Added: llvm/trunk/test/Other/extract.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/extract.ll?rev=114614&view=auto
==============================================================================
--- llvm/trunk/test/Other/extract.ll (added)
+++ llvm/trunk/test/Other/extract.ll Wed Sep 22 19:33:13 2010
@@ -0,0 +1,22 @@
+; RUN: llvm-extract -func foo -S < %s | FileCheck %s
+; RUN: llvm-extract -delete -func foo -S < %s | FileCheck --check-prefix=DELETE %s
+; RUN: llvm-as < %s > %t
+; RUN: llvm-extract -func foo -S %t | FileCheck %s
+; RUN: llvm-extract -delete -func foo -S %t | FileCheck --check-prefix=DELETE %s
+
+; llvm-extract uses lazy bitcode loading, so make sure it correctly reads
+; from bitcode files in addition to assembly files.
+
+; CHECK: define void @foo() {
+; CHECK: ret void
+; CHECK: }
+; DELETE: define void @bar() {
+; DELETE: ret void
+; DELETE: }
+
+define void @foo() {
+ ret void
+}
+define void @bar() {
+ ret void
+}
Modified: llvm/trunk/tools/llvm-extract/llvm-extract.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-extract/llvm-extract.cpp?rev=114614&r1=114613&r2=114614&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-extract/llvm-extract.cpp (original)
+++ llvm/trunk/tools/llvm-extract/llvm-extract.cpp Wed Sep 22 19:33:13 2010
@@ -26,6 +26,7 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/SystemUtils.h"
#include "llvm/System/Signals.h"
+#include "llvm/ADT/SmallPtrSet.h"
#include <memory>
using namespace llvm;
@@ -102,13 +103,39 @@
}
// Materialize requisite global values.
- for (size_t i = 0, e = GVs.size(); i != e; ++i) {
- GlobalValue *GV = GVs[i];
- if (GV->isMaterializable()) {
- std::string ErrInfo;
- if (GV->Materialize(&ErrInfo)) {
- errs() << argv[0] << ": error reading input: " << ErrInfo << "\n";
- return 1;
+ if (!DeleteFn)
+ for (size_t i = 0, e = GVs.size(); i != e; ++i) {
+ GlobalValue *GV = GVs[i];
+ if (GV->isMaterializable()) {
+ std::string ErrInfo;
+ if (GV->Materialize(&ErrInfo)) {
+ errs() << argv[0] << ": error reading input: " << ErrInfo << "\n";
+ return 1;
+ }
+ }
+ }
+ else {
+ // Deleting. Materialize every GV that's *not* in GVs.
+ SmallPtrSet<GlobalValue *, 8> GVSet(GVs.begin(), GVs.end());
+ for (Module::global_iterator I = M->global_begin(), E = M->global_end();
+ I != E; ++I) {
+ GlobalVariable *G = I;
+ if (!GVSet.count(G) && G->isMaterializable()) {
+ std::string ErrInfo;
+ if (G->Materialize(&ErrInfo)) {
+ errs() << argv[0] << ": error reading input: " << ErrInfo << "\n";
+ return 1;
+ }
+ }
+ }
+ for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) {
+ Function *F = I;
+ if (!GVSet.count(F) && F->isMaterializable()) {
+ std::string ErrInfo;
+ if (F->Materialize(&ErrInfo)) {
+ errs() << argv[0] << ": error reading input: " << ErrInfo << "\n";
+ return 1;
+ }
}
}
}
More information about the llvm-commits
mailing list