mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-28 21:34:23 +00:00
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:
parent
9db505ca9d
commit
7f4ec3b2e3
@ -126,6 +126,7 @@
|
|||||||
<li><a href="#i_returnaddress">'<tt>llvm.returnaddress</tt>' Intrinsic</a></li>
|
<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_frameaddress">'<tt>llvm.frameaddress</tt>' Intrinsic</a></li>
|
||||||
<li><a href="#i_prefetch">'<tt>llvm.prefetch</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>
|
</ol>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#int_os">Operating System Intrinsics</a>
|
<li><a href="#int_os">Operating System Intrinsics</a>
|
||||||
@ -2548,6 +2549,46 @@ performance.
|
|||||||
|
|
||||||
</div>
|
</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">
|
<div class="doc_subsection">
|
||||||
|
@ -35,6 +35,7 @@ namespace Intrinsic {
|
|||||||
returnaddress, // Yields the return address of a dynamic call frame
|
returnaddress, // Yields the return address of a dynamic call frame
|
||||||
frameaddress, // Yields the frame address of a dynamic call frame
|
frameaddress, // Yields the frame address of a dynamic call frame
|
||||||
prefetch, // Prefetch a value into the cache
|
prefetch, // Prefetch a value into the cache
|
||||||
|
pcmarker, // Export a PC from near the marker
|
||||||
|
|
||||||
// setjmp/longjmp intrinsics.
|
// setjmp/longjmp intrinsics.
|
||||||
setjmp, // Used to represent a setjmp call in C
|
setjmp, // Used to represent a setjmp call in C
|
||||||
|
@ -172,6 +172,9 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
|
|||||||
case Intrinsic::prefetch:
|
case Intrinsic::prefetch:
|
||||||
break; // Simply strip out prefetches on unsupported architectures
|
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_stoppoint:
|
||||||
case Intrinsic::dbg_region_start:
|
case Intrinsic::dbg_region_start:
|
||||||
case Intrinsic::dbg_region_end:
|
case Intrinsic::dbg_region_end:
|
||||||
|
@ -234,6 +234,7 @@ unsigned Function::getIntrinsicID() const {
|
|||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
if (getName() == "llvm.prefetch") return Intrinsic::prefetch;
|
if (getName() == "llvm.prefetch") return Intrinsic::prefetch;
|
||||||
|
if (getName() == "llvm.pcmarker") return Intrinsic::pcmarker;
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
if (getName() == "llvm.returnaddress") return Intrinsic::returnaddress;
|
if (getName() == "llvm.returnaddress") return Intrinsic::returnaddress;
|
||||||
|
@ -749,6 +749,11 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
|
|||||||
case Intrinsic::memset: NumArgs = 4; break;
|
case Intrinsic::memset: NumArgs = 4; break;
|
||||||
|
|
||||||
case Intrinsic::prefetch: NumArgs = 3; 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:
|
case Intrinsic::not_intrinsic:
|
||||||
assert(0 && "Invalid intrinsic!"); NumArgs = 0; break;
|
assert(0 && "Invalid intrinsic!"); NumArgs = 0; break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user