First step in adding pcmarker intrinsic. Second step (soon) is adding backend support.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20900 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Andrew Lenharth 2005-03-28 20:05:49 +00:00
parent 9db505ca9d
commit 7f4ec3b2e3
5 changed files with 51 additions and 0 deletions

View File

@ -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">

View File

@ -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

View File

@ -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:

View File

@ -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;

View File

@ -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;