SkJumper: Linux

Just need to take care to match C symbols with asm symbols.  Linux
doesn't add the leading underscore automatically like Mac and Windows.

Change-Id: I488cdfec942b442554ffefdfd006a1305ad77d9d
Reviewed-on: https://skia-review.googlesource.com/8667
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>
diff --git a/BUILD.gn b/BUILD.gn
index a442cce..a7787c3 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -29,7 +29,7 @@
   skia_enable_android_framework_defines = false
   skia_enable_discrete_gpu = true
   skia_enable_effects = true
-  skia_enable_jumper = is_skia_standalone && is_mac
+  skia_enable_jumper = is_skia_standalone && (is_linux || is_mac)
   skia_enable_gpu = true
   skia_enable_pdf = true
   skia_enable_tools = is_skia_standalone
diff --git a/src/jumper/SkJumper.cpp b/src/jumper/SkJumper.cpp
index ea7da54..d62b5b6 100644
--- a/src/jumper/SkJumper.cpp
+++ b/src/jumper/SkJumper.cpp
@@ -55,24 +55,31 @@
 // We'll only ever call start_pipeline(), which then chains into the rest for us.
 using StageFn = void(void);
 
+// Some platforms expect C "name" maps to asm "_name", others to "name".
+#if defined(_MSC_VER) || defined(__APPLE__)
+    #define ASM(name, suffix) sk_##name##_##suffix
+#else
+    #define ASM(name, suffix) _sk_##name##_##suffix
+#endif
+
 extern "C" {
 
 #if defined(__x86_64__) || defined(_M_X64)
-    void sk_start_pipeline_hsw  (size_t, void**, K*);
-    void sk_start_pipeline_sse41(size_t, void**, K*);
-    void sk_start_pipeline_sse2 (size_t, void**, K*);
+    void ASM(start_pipeline,hsw  )(size_t, void**, K*);
+    void ASM(start_pipeline,sse41)(size_t, void**, K*);
+    void ASM(start_pipeline,sse2 )(size_t, void**, K*);
 
-    StageFn sk_just_return_hsw,
-            sk_just_return_sse41,
-            sk_just_return_sse2;
+    StageFn ASM(just_return,hsw),
+            ASM(just_return,sse41),
+            ASM(just_return,sse2);
 
-    #define M(st) StageFn sk_##st##_hsw;
+    #define M(st) StageFn ASM(st,hsw);
         STAGES(M)
     #undef M
-    #define M(st) StageFn sk_##st##_sse41;
+    #define M(st) StageFn ASM(st,sse41);
         STAGES(M)
     #undef M
-    #define M(st) StageFn sk_##st##_sse2;
+    #define M(st) StageFn ASM(st,sse2);
         STAGES(M)
     #undef M
 #endif
@@ -91,7 +98,7 @@
     static StageFn* lookup_hsw(SkRasterPipeline::StockStage st) {
         switch (st) {
             default: return nullptr;
-        #define M(st) case SkRasterPipeline::st: return sk_##st##_hsw;
+        #define M(st) case SkRasterPipeline::st: return ASM(st,hsw);
             STAGES(M)
         #undef M
         }
@@ -99,7 +106,7 @@
     static StageFn* lookup_sse41(SkRasterPipeline::StockStage st) {
         switch (st) {
             default: return nullptr;
-        #define M(st) case SkRasterPipeline::st: return sk_##st##_sse41;
+        #define M(st) case SkRasterPipeline::st: return ASM(st,sse41);
             STAGES(M)
         #undef M
         }
@@ -107,7 +114,7 @@
     static StageFn* lookup_sse2(SkRasterPipeline::StockStage st) {
         switch (st) {
             default: return nullptr;
-        #define M(st) case SkRasterPipeline::st: return sk_##st##_sse2;
+        #define M(st) case SkRasterPipeline::st: return ASM(st,sse2);
             STAGES(M)
         #undef M
         }
@@ -154,17 +161,17 @@
     // While possible, build and run at full vector stride.
 #if defined(__x86_64__) || defined(_M_X64)
     if (1 && SkCpu::Supports(SkCpu::HSW)) {
-        if (!build_and_run(8, lookup_hsw, sk_just_return_hsw, sk_start_pipeline_hsw)) {
+        if (!build_and_run(8, lookup_hsw, ASM(just_return,hsw), ASM(start_pipeline,hsw))) {
             return false;
         }
     }
     if (1 && SkCpu::Supports(SkCpu::SSE41)) {
-        if (!build_and_run(4, lookup_sse41, sk_just_return_sse41, sk_start_pipeline_sse41)) {
+        if (!build_and_run(4, lookup_sse41, ASM(just_return,sse41), ASM(start_pipeline,sse41))) {
             return false;
         }
     }
     if (1 && SkCpu::Supports(SkCpu::SSE2)) {
-        if (!build_and_run(4, lookup_sse2, sk_just_return_sse2, sk_start_pipeline_sse2)) {
+        if (!build_and_run(4, lookup_sse2, ASM(just_return,sse2), ASM(start_pipeline,sse2))) {
             return false;
         }
     }