[PATCH] Teach CC1 to dump module dependencies to a directory

Ben Langmuir blangmuir at apple.com
Thu Jun 19 09:42:34 PDT 2014


Hi Justin,

Thanks for working on this! It’s looking pretty close.

> +/// Append the absolute path in Nested to the path given by Root. This will
> +/// remove directory traversal from the resulting nested path.
> +static void appendNestedPath(SmallVectorImpl<char> &Root,
> +                             SmallVectorImpl<char> &Nested) {
> +  using namespace llvm::sys;
> +  SmallVector<StringRef, 16> ComponentStack;
> +
> +  StringRef Rel = path::relative_path(StringRef(Nested.begin(), Nested.size()));

You seem to have manually inlined Nested.str() ;-)  Maybe just make your Nested parameter a StringRef?

> +  // We need an absolute path to append to the root.
> +  SmallString<256> AbsoluteSrc = Src;
> +  fs::make_absolute(AbsoluteSrc);
> +  // Build the destination path.
> +  SmallString<256> Dest = Collector.getDest();
> +  size_t RootLen = Dest.size();
> +  appendNestedPath(Dest, AbsoluteSrc);

Do we need to escape this somehow on Windows, since you might get C: in the middle of your path?

And in general, will this work if Dest ends with a path separator?  Then you would end up with // in the middle, which could potentially be eaten at some point (not sure).

> +bool ModuleDependencyListener::visitInputFile(StringRef Filename, bool IsSystem,
> +                                              bool IsOverridden) {
> +  if (!Collector.insertSeen(Filename))
> +    return true;
> +  if (copyToRoot(Filename))
> +    Collector.setHasErrors();
> +  return true;
> +}

This is clearer to me if you invert the first if, but you decide.
if (Collector.insertSeen(Filename))
  if (copyToRoot(Filename))
    Collector.setHasErrors();
return true;

> +// RUN: find %t/vfs -type f | FileCheck %s -check-prefix=DUMP
> +// DUMP: AlsoDependsOnModule.framework/Headers/AlsoDependsOnModule.h
> +// DUMP: Module.framework/Frameworks/SubFramework.framework/Headers/SubFramework.h

REQUIRES: shell, since you need ‘find’.  This applies to both tests.  Also you won’t get the path separators you expect on Windows.


This isn’t really the place to discuss llvm patches, but...

> +  char *Buf = new char[BufSize];
If you don’t want to put 4 KB on the stack, how about std::vector with its data() method?

> +  for (;;) {
> +    Bytes = read(ReadFD, Buf, BufSize);
> +    if (Bytes <= 0)
> +      break;
> +    Bytes = write(WriteFD, Buf, Bytes);
> +    if (Bytes <= 0)
> +      break;
> +  }

This doesn’t seem sufficiently paranoid about the number of bytes actually written by ‘write’.

> 
> <clang-0001-Frontend-Add-a-CC1-flag-to-dump-module-dependencies.3.patch><llvm-0001-Support-Add-llvm-sys-fs-copy_file.2.patch>





More information about the cfe-commits mailing list