[llvm] r229451 - [Orc] Add an emitAndFinalize method to the ObjectLinkingLayer, IRCompileLayer
Lang Hames
lhames at gmail.com
Tue Feb 17 12:51:24 PST 2015
Hi Dave,
emitAndFinalize exists to control emission when the symbols contained in
the module are irrelevant (e.g. the finalization is being forced for
performance reasons, not because a symbol is currently required), or
invisible to findSymbol (e.g. the desired symbol is a common symbol or
contained in inline assembly).
If the user wants a symbol they should use findSymbol/findSymbolIn.
Cheers,
Lang.
On Tue, Feb 17, 2015 at 10:58 AM, David Blaikie <dblaikie at gmail.com> wrote:
> Should emitAndFinalize return the address or SymbolRef? It'd often be used
> in resolvers followed immediately by a query for the address, would it not?
>
>
> On Mon, Feb 16, 2015 at 2:36 PM, Lang Hames <lhames at gmail.com> wrote:
>
>> Author: lhames
>> Date: Mon Feb 16 16:36:25 2015
>> New Revision: 229451
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=229451&view=rev
>> Log:
>> [Orc] Add an emitAndFinalize method to the ObjectLinkingLayer,
>> IRCompileLayer
>> and LazyEmittingLayer of Orc.
>>
>> This method allows you to immediately emit and finalize a module. It is
>> required
>> by an upcoming refactor of the indirection utils and the compile-on-demand
>> layer.
>>
>> I've filed http://llvm.org/PR22608 to write unit tests for this and
>> other Orc
>> APIs.
>>
>> Modified:
>> llvm/trunk/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h
>> llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h
>> llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h
>>
>> Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h?rev=229451&r1=229450&r2=229451&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h
>> (original)
>> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/IRCompileLayer.h Mon Feb
>> 16 16:36:25 2015
>> @@ -111,6 +111,13 @@ public:
>> return BaseLayer.findSymbolIn(H, Name, ExportedSymbolsOnly);
>> }
>>
>> + /// @brief Immediately emit and finalize the moduleOB set represented
>> by the
>> + /// given handle.
>> + /// @param H Handle for module set to emit/finalize.
>> + void emitAndFinalize(ModuleSetHandleT H) {
>> + BaseLayer.emitAndFinalize(H);
>> + }
>> +
>> private:
>> object::OwningBinary<object::ObjectFile>
>> tryToLoadFromObjectCache(const Module &M) {
>>
>> Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h?rev=229451&r1=229450&r2=229451&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h
>> (original)
>> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h Mon
>> Feb 16 16:36:25 2015
>> @@ -53,7 +53,7 @@ private:
>> return 0;
>> else if (this->EmitState == NotEmitted) {
>> this->EmitState = Emitting;
>> - Handle = this->emit(B);
>> + Handle = this->emitToBaseLayer(B);
>> this->EmitState = Emitted;
>> }
>> return B.findSymbolIn(Handle, PName, ExportedSymbolsOnly)
>> @@ -78,6 +78,17 @@ private:
>> BaseLayer.removeModuleSet(Handle);
>> }
>>
>> + void emitAndFinalize(BaseLayerT &BaseLayer) {
>> + assert(EmitState != Emitting &&
>> + "Cannot emitAndFinalize while already emitting");
>> + if (EmitState == NotEmitted) {
>> + EmitState = Emitting;
>> + Handle = emitToBaseLayer(BaseLayer);
>> + EmitState = Emitted;
>> + }
>> + BaseLayer.emitAndFinalize(Handle);
>> + }
>> +
>> template <typename ModuleSetT>
>> static std::unique_ptr<EmissionDeferredSet>
>> create(BaseLayerT &B, ModuleSetT Ms,
>> @@ -85,7 +96,7 @@ private:
>>
>> protected:
>> virtual bool provides(StringRef Name, bool ExportedSymbolsOnly)
>> const = 0;
>> - virtual BaseLayerHandleT emit(BaseLayerT &BaseLayer) = 0;
>> + virtual BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) = 0;
>>
>> private:
>> enum { NotEmitted, Emitting, Emitted } EmitState;
>> @@ -100,7 +111,8 @@ private:
>> : Ms(std::move(Ms)), MM(std::move(MM)) {}
>>
>> protected:
>> - BaseLayerHandleT emit(BaseLayerT &BaseLayer) override {
>> +
>> + BaseLayerHandleT emitToBaseLayer(BaseLayerT &BaseLayer) override {
>> // We don't need the mangled names set any more: Once we've
>> emitted this
>> // to the base layer we'll just look for symbols there.
>> MangledNames.reset();
>> @@ -243,6 +255,14 @@ public:
>> bool ExportedSymbolsOnly) {
>> return (*H)->find(Name, ExportedSymbolsOnly, BaseLayer);
>> }
>> +
>> + /// @brief Immediately emit and finalize the moduleOB set represented
>> by the
>> + /// given handle.
>> + /// @param H Handle for module set to emit/finalize.
>> + void emitAndFinalize(ModuleSetHandleT H) {
>> + (*H)->emitAndFinalize(BaseLayer);
>> + }
>> +
>> };
>>
>> template <typename BaseLayerT>
>>
>> Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h?rev=229451&r1=229450&r2=229451&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h
>> (original)
>> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h Mon
>> Feb 16 16:36:25 2015
>> @@ -178,12 +178,6 @@ public:
>> return Handle;
>> }
>>
>> - /// @brief Map section addresses for the objects associated with the
>> handle H.
>> - void mapSectionAddress(ObjSetHandleT H, const void *LocalAddress,
>> - TargetAddress TargetAddr) {
>> - H->mapSectionAddress(LocalAddress, TargetAddr);
>> - }
>> -
>> /// @brief Remove the set of objects associated with handle H.
>> ///
>> /// All memory allocated for the objects will be freed, and the
>> sections and
>> @@ -233,6 +227,21 @@ public:
>> return nullptr;
>> }
>>
>> + /// @brief Map section addresses for the objects associated with the
>> handle H.
>> + void mapSectionAddress(ObjSetHandleT H, const void *LocalAddress,
>> + TargetAddress TargetAddr) {
>> + H->mapSectionAddress(LocalAddress, TargetAddr);
>> + }
>> +
>> + /// @brief Immediately emit and finalize the object set represented by
>> the
>> + /// given handle.
>> + /// @param H Handle for object set to emit/finalize.
>> + void emitAndFinalize(ObjSetHandleT H) {
>> + H->Finalize();
>> + if (NotifyFinalized)
>> + NotifyFinalized(H);
>> + }
>> +
>> private:
>> LinkedObjectSetListT LinkedObjSetList;
>> NotifyLoadedFtor NotifyLoaded;
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150217/64c4e29e/attachment.html>
More information about the llvm-commits
mailing list