[PATCH] Teach CC1 to dump module dependencies to a directory
Justin Bogner
mail at justinbogner.com
Thu Jun 19 13:28:37 PDT 2014
Ben Langmuir <blangmuir at apple.com> writes:
> LGTM.
r211302 and r211303.
>> On Jun 19, 2014, at 11:53 AM, Justin Bogner <mail at justinbogner.com> wrote:
>>
>> Ben Langmuir <blangmuir at apple.com> writes:
>>> On Jun 19, 2014, at 10:31 AM, Justin Bogner <mail at justinbogner.com> wrote:
>>>
>>> Ben Langmuir <blangmuir at apple.com> writes:
>>>
>>> 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?
>>>
>>> Right, not sure what I was thinking there :). I'll pass in a StringRef
>>> instead.
>>>
>>> + // 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).
>>>
>>> The call to path::relative_path in appendNestedPath takes care of both
>>> of these issues. It's strips off root_name (ie, C:) and root_directory
>>> (ie, /).
>>>
>>> It sure does, silly me.
>>>
>>> +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;
>>>
>>> Sure, I'm happy with either.
>>>
>>> +// 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.
>>>
>>> Hmm. Is there a good way to check if the files are created without find?
>>> Assuming there is, I'll change it use regex for the path separators, as
>>> I think the extra platform coverage here is worthwhile.
>>>
>>> I can’t think of a cleaner way to do this.
>>>
>>> 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?
>>>
>>> Yeah, 4k seemed like a bit much for the stack (though, this is always a
>>> leaf call, so maybe it's fine).
>>>
>>> Is a vector really better here? Since I have to manually manage closing
>>> the files anyway, the new/delete doesn't feel out of place, and using a
>>> std::vector or a std::unique_ptr purely as an RAII container muddies up
>>> what this is doing a bit.
>>>
>>> I don’t feel strongly about it, so go with what you have.
>>>
>>> + 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’.
>>>
>>> Right. This should probably loop on the write as well. I'll update that.
>>
>> New patches attached.
>>
>> <clang-0001-Frontend-Add-a-CC1-flag-to-dump-module-dependencies.4.patch><llvm-0001-Support-Add-llvm-sys-fs-copy_file.3.patch>
More information about the cfe-commits
mailing list