On 14/11/2013 16:33, Argyrios Kyrtzidis wrote:
Author: akirtzidis
Date: Thu Nov 14 10:33:29 2013
New Revision: 194710

URL: http://llvm.org/viewvc/llvm-project?rev=194710&view=rev
Log:
[objcmt] Introduce "objcmt-white-list-dir-path=" option.

This options accepts a path to a directory, collects the filenames of the files
it contains, and the migrator will only modify files with the same filename.

Added:
     cfe/trunk/test/ARCMT/whitelisted/
     cfe/trunk/test/ARCMT/whitelisted/Inputs/
     cfe/trunk/test/ARCMT/whitelisted/Inputs/header1.h
     cfe/trunk/test/ARCMT/whitelisted/header1.h
     cfe/trunk/test/ARCMT/whitelisted/header1.h.result
     cfe/trunk/test/ARCMT/whitelisted/header2.h
     cfe/trunk/test/ARCMT/whitelisted/header2.h.result
     cfe/trunk/test/ARCMT/whitelisted/objcmt-with-whitelist.m
Modified:
     cfe/trunk/include/clang/Driver/Options.td
     cfe/trunk/include/clang/Frontend/FrontendOptions.h
     cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
     cfe/trunk/lib/Driver/Tools.cpp
     cfe/trunk/lib/Frontend/CompilerInvocation.cpp

Modified: cfe/trunk/include/clang/Driver/Options.td
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=194710&r1=194709&r2=194710&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Options.td (original)
+++ cfe/trunk/include/clang/Driver/Options.td Thu Nov 14 10:33:29 2013
@@ -178,13 +178,14 @@ def objcmt_migrate_nsmacros : Flag<["-"]
    HelpText<"Enable migration to NS_ENUM/NS_OPTIONS macros">;
  def objcmt_migrate_protocol_conformance : Flag<["-"], 
"objcmt-migrate-protocol-conformance">, Flags<[CC1Option]>,
    HelpText<"Enable migration to add protocol conformance on classes">;
-def objcmt_atomic_property : Flag<["-"], "objcmt-atomic-property">,
-  Flags<[CC1Option]>,
+def objcmt_atomic_property : Flag<["-"], "objcmt-atomic-property">, 
Flags<[CC1Option]>,
    HelpText<"Make migration to 'atomic' properties">;
  def objcmt_returns_innerpointer_property : Flag<["-"], 
"objcmt-returns-innerpointer-property">, Flags<[CC1Option]>,
    HelpText<"Enable migration to annotate property with 
NS_RETURNS_INNER_POINTER">;
  def objcmt_ns_nonatomic_iosonly: Flag<["-"], "objcmt-ns-nonatomic-iosonly">, 
Flags<[CC1Option]>,
    HelpText<"Enable migration to use NS_NONATOMIC_IOSONLY macro for setting property's 
'atomic' attribute">;
+def objcmt_white_list_dir_path: Joined<["-"], "objcmt-white-list-dir-path=">, 
Flags<[CC1Option]>,
+  HelpText<"Only modify files with a filename contained in the provided directory 
path">;

Hi Argyrios,

Whitelist is one word.

This set of changes will need s/white[_-]list/whitelist/ and s/WhiteList/Whitelist/.

If you need compatibility with the misspelt form it's OK to add an option alias.

(Still catching up with November commits)

Alp.



// Make sure all other -ccc- options are rejected.
  def ccc_ : Joined<["-"], "ccc-">, Group<internal_Group>, Flags<[Unsupported]>;

Modified: cfe/trunk/include/clang/Frontend/FrontendOptions.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendOptions.h?rev=194710&r1=194709&r2=194710&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/FrontendOptions.h (original)
+++ cfe/trunk/include/clang/Frontend/FrontendOptions.h Thu Nov 14 10:33:29 2013
@@ -186,6 +186,7 @@ public:
      ObjCMT_MigrateAll = (ObjCMT_Literals | ObjCMT_Subscripting | 
ObjCMT_MigrateDecls)
    };
    unsigned ObjCMTAction;
+  std::string ObjCMTWhiteListPath;
std::string MTMigrateDir;
    std::string ARCMTMigrateReportOut;

Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=194710&r1=194709&r2=194710&view=diff
==============================================================================
--- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original)
+++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Thu Nov 14 10:33:29 2013
@@ -28,6 +28,7 @@
  #include "clang/StaticAnalyzer/Checkers/ObjCRetainCount.h"
  #include "clang/AST/Attr.h"
  #include "llvm/ADT/SmallString.h"
+#include "llvm/Support/Path.h"
using namespace clang;
  using namespace arcmt;
@@ -90,6 +91,7 @@ public:
    bool IsOutputFile;
    llvm::SmallPtrSet<ObjCProtocolDecl *, 32> ObjCProtocolDecls;
    llvm::SmallVector<const Decl *, 8> CFFunctionIBCandidates;
+  llvm::StringMap<char> WhiteListFilenames;
ObjCMigrateASTConsumer(StringRef migrateDir,
                           unsigned astMigrateActions,
@@ -97,12 +99,19 @@ public:
                           FileManager &fileMgr,
                           const PPConditionalDirectiveRecord *PPRec,
                           Preprocessor &PP,
-                         bool isOutputFile = false)
+                         bool isOutputFile,
+                         ArrayRef<std::string> WhiteList)
    : MigrateDir(migrateDir),
      ASTMigrateActions(astMigrateActions),
      NSIntegerTypedefed(0), NSUIntegerTypedefed(0),
      Remapper(remapper), FileMgr(fileMgr), PPRec(PPRec), PP(PP),
-    IsOutputFile(isOutputFile) { }
+    IsOutputFile(isOutputFile) {
+
+    for (ArrayRef<std::string>::iterator
+           I = WhiteList.begin(), E = WhiteList.end(); I != E; ++I) {
+      WhiteListFilenames.GetOrCreateValue(*I);
+    }
+  }
protected:
    virtual void Initialize(ASTContext &Context) {
@@ -125,6 +134,13 @@ protected:
    }
virtual void HandleTranslationUnit(ASTContext &Ctx);
+
+  bool canModifyFile(StringRef Path) {
+    if (WhiteListFilenames.empty())
+      return true;
+    return WhiteListFilenames.find(llvm::sys::path::filename(Path))
+        != WhiteListFilenames.end();
+  }
  };
}
@@ -151,7 +167,9 @@ ASTConsumer *ObjCMigrateAction::CreateAS
                                                         Remapper,
                                                      
CompInst->getFileManager(),
                                                         PPRec,
-                                                       
CompInst->getPreprocessor());
+                                                       
CompInst->getPreprocessor(),
+                                                       false,
+                                                       
ArrayRef<std::string>());
    ASTConsumer *Consumers[] = { MTConsumer, WrappedConsumer };
    return new MultiplexConsumer(Consumers);
  }
@@ -1682,6 +1700,8 @@ void ObjCMigrateASTConsumer::HandleTrans
      assert(file);
      if (IsReallyASystemHeader(Ctx, file, FID))
        continue;
+    if (!canModifyFile(file->getName()))
+      continue;
      SmallString<512> newText;
      llvm::raw_svector_ostream vecOS(newText);
      buf.write(vecOS);
@@ -1705,6 +1725,25 @@ bool MigrateSourceAction::BeginInvocatio
    return true;
  }
+static std::vector<std::string> getWhiteListFilenames(StringRef DirPath) {
+  using namespace llvm::sys::fs;
+  using namespace llvm::sys::path;
+
+  std::vector<std::string> Filenames;
+  if (DirPath.empty() || !is_directory(DirPath))
+    return Filenames;
+
+  llvm::error_code EC;
+  directory_iterator DI = directory_iterator(DirPath, EC);
+  directory_iterator DE;
+  for (; !EC && DI != DE; DI = DI.increment(EC)) {
+    if (is_regular_file(DI->path()))
+      Filenames.push_back(filename(DI->path()));
+  }
+
+  return Filenames;
+}
+
  ASTConsumer *MigrateSourceAction::CreateASTConsumer(CompilerInstance &CI,
                                                    StringRef InFile) {
    PPConditionalDirectiveRecord *
@@ -1721,11 +1760,14 @@ ASTConsumer *MigrateSourceAction::Create
                      FrontendOptions::ObjCMT_Subscripting;
    }
    CI.getPreprocessor().addPPCallbacks(PPRec);
+  std::vector<std::string> WhiteList =
+    getWhiteListFilenames(CI.getFrontendOpts().ObjCMTWhiteListPath);
    return new ObjCMigrateASTConsumer(CI.getFrontendOpts().OutputFile,
                                      ObjCMTAction,
                                      Remapper,
                                      CI.getFileManager(),
                                      PPRec,
                                      CI.getPreprocessor(),
-                                    /*isOutputFile=*/true);
+                                    /*isOutputFile=*/true,
+                                    WhiteList);
  }

Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=194710&r1=194709&r2=194710&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Thu Nov 14 10:33:29 2013
@@ -2726,6 +2726,7 @@ void Clang::ConstructJob(Compilation &C,
      Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
      Args.AddLastArg(CmdArgs, 
options::OPT_objcmt_returns_innerpointer_property);
      Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
+    Args.AddLastArg(CmdArgs, options::OPT_objcmt_white_list_dir_path);
    }
// Add preprocessing options like -I, -D, etc. if we are using the

Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=194710&r1=194709&r2=194710&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Nov 14 10:33:29 2013
@@ -821,6 +821,8 @@ static InputKind ParseFrontendArgs(Front
    if (Args.hasArg(OPT_objcmt_migrate_all))
      Opts.ObjCMTAction |= FrontendOptions::ObjCMT_MigrateDecls;
+ Opts.ObjCMTWhiteListPath = Args.getLastArgValue(OPT_objcmt_white_list_dir_path);
+
    if (Opts.ARCMTAction != FrontendOptions::ARCMT_None &&
        Opts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
      Diags.Report(diag::err_drv_argument_not_allowed_with)

Added: cfe/trunk/test/ARCMT/whitelisted/Inputs/header1.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/whitelisted/Inputs/header1.h?rev=194710&view=auto
==============================================================================
--- cfe/trunk/test/ARCMT/whitelisted/Inputs/header1.h (added)
+++ cfe/trunk/test/ARCMT/whitelisted/Inputs/header1.h Thu Nov 14 10:33:29 2013
@@ -0,0 +1 @@
+// the contents are not important

Added: cfe/trunk/test/ARCMT/whitelisted/header1.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/whitelisted/header1.h?rev=194710&view=auto
==============================================================================
--- cfe/trunk/test/ARCMT/whitelisted/header1.h (added)
+++ cfe/trunk/test/ARCMT/whitelisted/header1.h Thu Nov 14 10:33:29 2013
@@ -0,0 +1,5 @@
+
+@interface I1 : NSObject
+-(int)prop;
+-(void)setProp:(int)p;
+@end

Added: cfe/trunk/test/ARCMT/whitelisted/header1.h.result
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/whitelisted/header1.h.result?rev=194710&view=auto
==============================================================================
--- cfe/trunk/test/ARCMT/whitelisted/header1.h.result (added)
+++ cfe/trunk/test/ARCMT/whitelisted/header1.h.result Thu Nov 14 10:33:29 2013
@@ -0,0 +1,4 @@
+
+@interface I1 : NSObject
+@property (nonatomic) int prop;
+@end

Added: cfe/trunk/test/ARCMT/whitelisted/header2.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/whitelisted/header2.h?rev=194710&view=auto
==============================================================================
--- cfe/trunk/test/ARCMT/whitelisted/header2.h (added)
+++ cfe/trunk/test/ARCMT/whitelisted/header2.h Thu Nov 14 10:33:29 2013
@@ -0,0 +1,5 @@
+
+@interface I2 : NSObject
+-(int)prop;
+-(void)setProp:(int)p;
+@end

Added: cfe/trunk/test/ARCMT/whitelisted/header2.h.result
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/whitelisted/header2.h.result?rev=194710&view=auto
==============================================================================
--- cfe/trunk/test/ARCMT/whitelisted/header2.h.result (added)
+++ cfe/trunk/test/ARCMT/whitelisted/header2.h.result Thu Nov 14 10:33:29 2013
@@ -0,0 +1,4 @@
+
+@interface I2 : NSObject
+@property (nonatomic) int prop;
+@end

Added: cfe/trunk/test/ARCMT/whitelisted/objcmt-with-whitelist.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/whitelisted/objcmt-with-whitelist.m?rev=194710&view=auto
==============================================================================
--- cfe/trunk/test/ARCMT/whitelisted/objcmt-with-whitelist.m (added)
+++ cfe/trunk/test/ARCMT/whitelisted/objcmt-with-whitelist.m Thu Nov 14 
10:33:29 2013
@@ -0,0 +1,12 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -objcmt-migrate-readwrite-property %s -triple 
x86_64-apple-darwin11 -migrate -o %t.remap
+// RUN: c-arcmt-test %t.remap | arcmt-test -verify-transformed-files 
%S/header1.h.result %S/header2.h.result
+// RUN: %clang_cc1 -objcmt-migrate-readwrite-property 
-objcmt-white-list-dir-path=%S/Inputs %s -triple x86_64-apple-darwin11 -migrate 
-o %t.remap
+// RUN: c-arcmt-test %t.remap | arcmt-test -verify-transformed-files 
%S/header1.h.result
+
+@interface NSObject
++ (id)alloc;
+@end
+
+#include "header1.h"
+#include "header2.h"


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

--
http://www.nuanti.com
the browser experts

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to