aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/LangRef.html41
-rw-r--r--include/llvm/Intrinsics.h1
-rw-r--r--lib/CodeGen/IntrinsicLowering.cpp3
-rw-r--r--lib/VMCore/Function.cpp1
-rw-r--r--lib/VMCore/Verifier.cpp5
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 &lt;id&gt; )
+</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;