[PATCH] Add getters for Pass IDs used by Polly plug-in.
Andrew Trick
atrick at apple.com
Tue Mar 5 13:46:45 PST 2013
On Mar 5, 2013, at 11:30 AM, Matthew Curtis <mcurtis at codeaurora.org> wrote:
> On 3/5/2013 1:03 PM, Andrew Trick wrote:
>> On Mar 4, 2013, at 2:40 PM, Matthew Curtis <mcurtis at codeaurora.org> wrote:
>>
>>> [re-submitting this patch in the hopes that it will find new life]
>>>
>>> This patch helps resolve a couple of issues we encountered while
>>> porting the Polly plug-in to Windows.
>>>
>>> The Polly plugin depends on some LLVM Passes which it identifies via
>>> Pass IDs. Pass IDs are implemented as the address of a static member
>>> variable (ID) of the Pass. On Windows however, there seems to be a bug
>>> in the Visual Studio compiler or linker that results in multiple
>>> dll-local copies of this data when referenced directly. The result is
>>> that Polly is unable to locate Passes that are part of the executable
>>> it is being loaded into.
>>>
>>> As a work around, this patch adds getters (GetClassPassID) for the
>>> Pass IDs used by Polly. The symbols for the globals are not
>>> exported. The getters are exported and Polly uses them instead.
>>>
>>> Removing use of global data by the Polly plug-in also makes it
>>> possible to delay load LLVM symbols from the containing executable
>>> which in turn removes the restriction that the executable have a
>>> specific name (determined at link-time).
>>>
>>> We also considered a couple alternatives to this minimal patch:
>>>
>>> 1) Update *all* Passes to provide GetClassPassID in lieu of ID.
>>>
>>> This leaves the code in the cleanest state and would be a good
>>> choice if starting from scratch. However I started implementing it
>>> and it turns out to have a very large ripple effect. Not only does
>>> it require changing a large number of files in LLVM, but it breaks
>>> source compatibility for passes that are not part of the LLVM
>>> source.
>>>
>>> That being said, I'd be willing to do the work if everyone thinks
>>> that's the right thing to do and we're willing break source
>>> compatibility.
>>>
>>> Perhaps we could ease the pain by deprecating ID for some time
>>> before removing it.
>>>
>>> 2) Add GetClassPassID to Passes accessible by plug-ins (i.e. those
>>> under include/llvm), but leave ID as it is.
>>>
>>> As with the proposed patch, this may cause confusion because there
>>> are multiple ways of getting a Pass's ID. But at least it's not
>>> specific to the Polly plug-in and other plug-ins on Windows may
>>> benefit.
>>>
>>> Thanks,
>>> Matthew Curtis
>>>
>>> BTW, there's a brief related discussion on llvm-dev here:
>>> http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-January/058838.html
>>> http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-February/thread.html#58982
>> Hi Matthew,
>>
>> Isn't it more convenient to refer to pass IDs without including all the pass headers and being forced to define the pass in the header?
> Yes, but pass IDs are not always provided separately. For example the DominatorTree, LoopInfo, and ScalarEvolution passes do not.
>> Does the linker resolve the ID address uniquely when you use an extern global reference instead?
> No. It does not work correctly when data is shared across library boundaries.
Sorry, I don't really understand the nature of the linker bug. I don't understand how it's possible for Polly to import llvm's C++ ABI if it can't "import data". Are you trying to make a DLL-safe subset of llvm's C++ ABI, free of all global data and static fields? That doesn't seem generally possible without formalizing that interface. It's something you should discuss on llvm-dev with people who have experience with that sort of thing!
-Andy
More information about the llvm-commits
mailing list