diff options
-rw-r--r-- | docs/LangRef.html | 41 | ||||
-rw-r--r-- | include/llvm/Intrinsics.h | 1 | ||||
-rw-r--r-- | lib/CodeGen/IntrinsicLowering.cpp | 3 | ||||
-rw-r--r-- | lib/VMCore/Function.cpp | 1 | ||||
-rw-r--r-- | lib/VMCore/Verifier.cpp | 5 |
5 files changed, 51 insertions, 0 deletions
diff --git a/docs/LangRef.html b/docs/LangRef.html index 807c7515b4..b7bbac34c9 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -126,6 +126,7 @@ <li><a href="#i_returnaddress">'<tt>llvm.returnaddress</tt>' Intrinsic</a></li> <li><a href="#i_frameaddress">'<tt>llvm.frameaddress</tt>' Intrinsic</a></li> <li><a href="#i_prefetch">'<tt>llvm.prefetch</tt>' Intrinsic</a></li> + <li><a href="#i_pcmarker">'<tt>llvm.pcmarker</tt>' Intrinsic</a></li> </ol> </li> <li><a href="#int_os">Operating System Intrinsics</a> @@ -2548,6 +2549,46 @@ performance. </div> +<!-- _______________________________________________________________________ --> +<div class="doc_subsubsection"> + <a name="i_pcmarker">'<tt>llvm.pcmarker</tt>' Intrinsic</a> +</div> + +<div class="doc_text"> + +<h5>Syntax:</h5> +<pre> + call void (uint)* %llvm.pcmarker( uint <id> ) +</pre> + +<h5>Overview:</h5> + + +<p> +The '<tt>llvm.pcmarker</tt>' intrinsic is a method to export a PC in a region of +code to simulators and other tools. The method is target specific, but it is +expected that the marker will use exported symbols to transmit the PC of the marker. +The marker makes no guaranties that it will remain with any specific instruction +after optimizations. It is possible that the presense of a marker will inhibit +optimizations. The intended use is to be inserted after optmizations to allow +corrolations of simulation runs. +</p> + +<h5>Arguments:</h5> + +<p> +<tt>id</tt> is a numerical id identifying the marker. +</p> + +<h5>Semantics:</h5> + +<p> +This intrinsic does not modify the behavior of the program. Backends that do not +support this intrinisic may ignore it. +</p> + +</div> + <!-- ======================================================================= --> <div class="doc_subsection"> diff --git a/include/llvm/Intrinsics.h b/include/llvm/Intrinsics.h index fe3c7867ad..e0a8dd7954 100644 --- a/include/llvm/Intrinsics.h +++ b/include/llvm/Intrinsics.h @@ -35,6 +35,7 @@ namespace Intrinsic { returnaddress, // Yields the return address of a dynamic call frame frameaddress, // Yields the frame address of a dynamic call frame prefetch, // Prefetch a value into the cache + pcmarker, // Export a PC from near the marker // setjmp/longjmp intrinsics. setjmp, // Used to represent a setjmp call in C diff --git a/lib/CodeGen/IntrinsicLowering.cpp b/lib/CodeGen/IntrinsicLowering.cpp index 3633f966f9..b665557d2b 100644 --- a/lib/CodeGen/IntrinsicLowering.cpp +++ b/lib/CodeGen/IntrinsicLowering.cpp @@ -172,6 +172,9 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) { case Intrinsic::prefetch: break; // Simply strip out prefetches on unsupported architectures + case Intrinsic::pcmarker: + break; // Simply strip out pcmarker on unsupported architectures + case Intrinsic::dbg_stoppoint: case Intrinsic::dbg_region_start: case Intrinsic::dbg_region_end: diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index df8d1f904f..b883e07ddf 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -234,6 +234,7 @@ unsigned Function::getIntrinsicID() const { break; case 'p': if (getName() == "llvm.prefetch") return Intrinsic::prefetch; + if (getName() == "llvm.pcmarker") return Intrinsic::pcmarker; break; case 'r': if (getName() == "llvm.returnaddress") return Intrinsic::returnaddress; diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index 89fd98081f..3964817f82 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -749,6 +749,11 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) { case Intrinsic::memset: NumArgs = 4; break; case Intrinsic::prefetch: NumArgs = 3; break; + case Intrinsic::pcmarker: + NumArgs = 1; + Assert1(isa<Constant>(CI.getOperand(1)), + "First argument to llvm.pcmarker must be a constant!", &CI); + break; case Intrinsic::not_intrinsic: assert(0 && "Invalid intrinsic!"); NumArgs = 0; break; |