我正在尝试使用OpenSolutionAsync打开RoslynLight.sln,然后遍历所有项目.为了我的目的,我需要一个语义模型和解决参考.通过这个问题和这个问题的结合,我得出了这个部分解决方案:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.MSBuild;
using System.IO;
namespace OpenRoslyn
{
class Program
{
static void Main(string[] args)
{
var msbw = MSBuildWorkspace.Create();
var sln = msbw.OpenSolutionAsync(@"C:\Users\carr27\Documents\GitHub\roslyn\src\RoslynLight.sln").Result;
//var proj = sln.Projects.First(x => x.Name == "CodeAnalysis.Desktop");
var messages = new List<string>();
foreach (var p in sln.Projects)
{
Console.WriteLine(p.FilePath);
messages.Add(p.FilePath);
var facadesDir = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\Facades\";
var proj = p.AddMetadataReference(MetadataReference.CreateFromAssembly(typeof(object).Assembly));
proj = proj.AddMetadataReference(MetadataReference.CreateFromFile(facadesDir + "System.Runtime.dll"));
proj = proj.AddMetadataReference(MetadataReference.CreateFromFile(facadesDir …Run Code Online (Sandbox Code Playgroud) 如果我编译这个程序:
#include <stdio.h>
int main(int argc, char** argv) {
printf("hello world!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于x86-64,asm输出使用movl $.LC0, %edi/ call puts.(请参阅godbolt上的完整asm输出/编译选项.)
我的问题是:GCC如何知道字符串的地址可以适合32位立即数操作数?为什么不需要使用movabs $.LC0, %rdi(即a mov r64, imm64,不是零或符号扩展imm32).
AFAIK,没有任何迹象表明加载器必须决定在任何特定地址加载数据部分.如果字符串存储在上面的某个地址,1ULL << 32那么movl将忽略更高的位.我对clang有类似的行为,所以我不认为这是GCC独有的.
我关心的原因是我想创建自己的数据段,它存在于我选择的任意地址(可能超过2 ^ 32)的内存中.